mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
netfilter: nf_queue: handle socket prefetch
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: cf7fbe660f
("bpf: Add socket assign support")
Acked-by: Joe Stringer <joe@cilium.io>
Signed-off-by: Florian Westphal <fw@strlen.de>
This commit is contained in:
@@ -180,6 +180,18 @@ static int __nf_queue(struct sk_buff *skb, const struct nf_hook_state *state,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (skb_sk_is_prefetched(skb)) {
|
||||||
|
struct sock *sk = skb->sk;
|
||||||
|
|
||||||
|
if (!sk_is_refcounted(sk)) {
|
||||||
|
if (!refcount_inc_not_zero(&sk->sk_refcnt))
|
||||||
|
return -ENOTCONN;
|
||||||
|
|
||||||
|
/* drop refcount on skb_orphan */
|
||||||
|
skb->destructor = sock_edemux;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
entry = kmalloc(sizeof(*entry) + route_key_size, GFP_ATOMIC);
|
entry = kmalloc(sizeof(*entry) + route_key_size, GFP_ATOMIC);
|
||||||
if (!entry)
|
if (!entry)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
Reference in New Issue
Block a user