Message ID | 20200831040333.6058-14-khalid.elmously@canonical.com |
---|---|
State | New |
Headers | show |
Series | Requested eBPF improvements | expand |
On 31.08.20 06:03, Khalid Elmously wrote: > From: Joe Stringer <joe@wand.net.nz> This patch is missing: BugLink: https://bugs.launchpad.net/bugs/1887740 > > [ upstream commit 8e368dc72e86ad1e1a612416f32d5ad22dca88bc ] > > In testing, we found that for request sockets the sk->sk_reuseport field > may yet be uninitialized, which caused bpf_sk_assign() to randomly > succeed or return -ESOCKTNOSUPPORT when handling the forward ACK in a > three-way handshake. > > Fix it by only applying the reuseport check for full sockets. > > Fixes: cf7fbe660f2d ("bpf: Add socket assign support") > Signed-off-by: Joe Stringer <joe@wand.net.nz> > Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> > Acked-by: Martin KaFai Lau <kafai@fb.com> > Link: https://lore.kernel.org/bpf/20200408033540.10339-1-joe@wand.net.nz > Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> > Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com> > --- > net/core/filter.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/net/core/filter.c b/net/core/filter.c > index baaeab75327c..a895e272d75e 100644 > --- a/net/core/filter.c > +++ b/net/core/filter.c > @@ -5992,7 +5992,7 @@ BPF_CALL_3(bpf_sk_assign, struct sk_buff *, skb, struct sock *, sk, u64, flags) > return -EOPNOTSUPP; > if (unlikely(dev_net(skb->dev) != sock_net(sk))) > return -ENETUNREACH; > - if (unlikely(sk->sk_reuseport)) > + if (unlikely(sk_fullsock(sk) && sk->sk_reuseport)) > return -ESOCKTNOSUPPORT; > if (sk_is_refcounted(sk) && > unlikely(!refcount_inc_not_zero(&sk->sk_refcnt))) >
diff --git a/net/core/filter.c b/net/core/filter.c index baaeab75327c..a895e272d75e 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -5992,7 +5992,7 @@ BPF_CALL_3(bpf_sk_assign, struct sk_buff *, skb, struct sock *, sk, u64, flags) return -EOPNOTSUPP; if (unlikely(dev_net(skb->dev) != sock_net(sk))) return -ENETUNREACH; - if (unlikely(sk->sk_reuseport)) + if (unlikely(sk_fullsock(sk) && sk->sk_reuseport)) return -ESOCKTNOSUPPORT; if (sk_is_refcounted(sk) && unlikely(!refcount_inc_not_zero(&sk->sk_refcnt)))