diff --git a/criu/sk-tcp.c b/criu/sk-tcp.c index 366447ce3..a88c0603c 100644 --- a/criu/sk-tcp.c +++ b/criu/sk-tcp.c @@ -340,6 +340,7 @@ static int restore_tcp_conn_state(int sk, struct libsoccr_sk *socr, struct inet_ goto err_c; } + data.state = TCP_ESTABLISHED; data.inq_len = tse->inq_len; data.inq_seq = tse->inq_seq; data.outq_len = tse->outq_len; diff --git a/soccr/soccr.c b/soccr/soccr.c index 0dfdb5e75..c27ba66e8 100644 --- a/soccr/soccr.c +++ b/soccr/soccr.c @@ -109,6 +109,8 @@ static int refresh_sk(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, str return -1; } + data->state = TCP_ESTABLISHED; + if (ioctl(sk->fd, SIOCOUTQ, &size) == -1) { loge("Unable to get size of snd queue"); return -1; @@ -265,7 +267,7 @@ err_recv: /* * This is how much data we've had in the initial libsoccr */ -#define SOCR_DATA_MIN_SIZE (16 * sizeof(__u32)) +#define SOCR_DATA_MIN_SIZE (17 * sizeof(__u32)) int libsoccr_get_sk_data(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, unsigned data_size) { @@ -339,6 +341,9 @@ int libsoccr_set_sk_data_unbound(struct libsoccr_sk *sk, if (!data || data_size < SOCR_DATA_MIN_SIZE) return -1; + if (data->state != TCP_ESTABLISHED) + return -1; + if (set_queue_seq(sk, TCP_RECV_QUEUE, data->inq_seq - data->inq_len)) return -2; diff --git a/soccr/soccr.h b/soccr/soccr.h index 2d8b7f3e1..e6239b7ec 100644 --- a/soccr/soccr.h +++ b/soccr/soccr.h @@ -12,6 +12,7 @@ void libsoccr_set_log(unsigned int level, void (*fn)(unsigned int level, const c struct libsoccr_sk; struct libsoccr_sk_data { + __u32 state; __u32 inq_len; __u32 inq_seq; __u32 outq_len;