On Wed, Aug 17, 2022 at 12:54 PM -07, Cong Wang wrote: > From: Cong Wang <cong.wang@xxxxxxxxxxxxx> > > Before commit 965b57b469a5 ("net: Introduce a new proto_ops > ->read_skb()"), skb was not dequeued from receive queue hence > when we close TCP socket skb can be just flushed synchronously. > > After this commit, we have to uncharge skb immediately after being > dequeued, otherwise it is still charged in the original sock. And we > still need to retain skb->sk, as eBPF programs may extract sock > information from skb->sk. Therefore, we have to call > skb_set_owner_sk_safe() here. > > Fixes: 965b57b469a5 ("net: Introduce a new proto_ops ->read_skb()") > Reported-and-tested-by: syzbot+a0e6f8738b58f7654417@xxxxxxxxxxxxxxxxxxxxxxxxx > Tested-by: Stanislav Fomichev <sdf@xxxxxxxxxx> > Cc: Eric Dumazet <edumazet@xxxxxxxxxx> > Cc: John Fastabend <john.fastabend@xxxxxxxxx> > Cc: Jakub Sitnicki <jakub@xxxxxxxxxxxxxx> > Signed-off-by: Cong Wang <cong.wang@xxxxxxxxxxxxx> > --- > net/ipv4/tcp.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c > index 970e9a2cca4a..05da5cac080b 100644 > --- a/net/ipv4/tcp.c > +++ b/net/ipv4/tcp.c > @@ -1760,6 +1760,7 @@ int tcp_read_skb(struct sock *sk, skb_read_actor_t recv_actor) > int used; > > __skb_unlink(skb, &sk->sk_receive_queue); > + WARN_ON(!skb_set_owner_sk_safe(skb, sk)); > used = recv_actor(sk, skb); > if (used <= 0) { > if (!copied) That is a frequent operation. Don't we want WARN_ON_ONCE like in tcp_read_sock?