netfilter: nf_queue: handle socket prefetch
authorFlorian Westphal <fw@strlen.de>
Mon, 28 Feb 2022 23:46:19 +0000 (00:46 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 8 Mar 2022 18:12:45 +0000 (19:12 +0100)
commit216f3cb587e0447c5e662189bfc18b7d8474201b
tree31b61383a95082162573dd9b19bde4191dad5d63
parentdd648bd1b33a828f62befa696b206c688da0ec43
netfilter: nf_queue: handle socket prefetch

commit 3b836da4081fa585cf6c392f62557496f2cb0efe upstream.

In case someone combines bpf socket assign and nf_queue, then we will
queue an skb who references a struct sock that did not have its
reference count incremented.

As we leave rcu protection, there is no guarantee that skb->sk is still
valid.

For refcount-less skb->sk case, try to increment the reference count
and then override the destructor.

In case of failure we have two choices: orphan the skb and 'delete'
preselect or let nf_queue() drop the packet.

Do the latter, it should not happen during normal operation.

Fixes: cf7fbe660f2d ("bpf: Add socket assign support")
Acked-by: Joe Stringer <joe@cilium.io>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/netfilter/nf_queue.c