tcp: repair: fix TCP_QUEUE_SEQ implementation
[ Upstream commit6cd6cbf593
] When application uses TCP_QUEUE_SEQ socket option to change tp->rcv_next, we must also update tp->copied_seq. Otherwise, stuff relying on tcp_inq() being precise can eventually be confused. For example, tcp_zerocopy_receive() might crash because it does not expect tcp_recv_skb() to return NULL. We could add tests in various places to fix the issue, or simply make sure tcp_inq() wont return a random value, and leave fast path as it is. Note that this fixes ioctl(fd, SIOCINQ, &val) at the same time. Fixes:ee9952831c
("tcp: Initial repair mode") Fixes:05255b823a
("tcp: add TCP_ZEROCOPY_RECEIVE support for zerocopy receive") Signed-off-by: Eric Dumazet <edumazet@google.com> Reported-by: syzbot <syzkaller@googlegroups.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
27cf5410a9
commit
a6ce82deba
|
@ -2943,8 +2943,10 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
|
|||
err = -EPERM;
|
||||
else if (tp->repair_queue == TCP_SEND_QUEUE)
|
||||
WRITE_ONCE(tp->write_seq, val);
|
||||
else if (tp->repair_queue == TCP_RECV_QUEUE)
|
||||
else if (tp->repair_queue == TCP_RECV_QUEUE) {
|
||||
WRITE_ONCE(tp->rcv_nxt, val);
|
||||
WRITE_ONCE(tp->copied_seq, val);
|
||||
}
|
||||
else
|
||||
err = -EINVAL;
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue