Message ID | 20250207135841.1948589-3-edumazet@google.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 628e6d18930bbd21f2d4562228afe27694f66da9 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: second round to use dev_net_rcu() | expand |
On 2/7/25 6:58 AM, Eric Dumazet wrote: > ndisc_alloc_skb() can be called without RTNL or RCU being held. > > Add RCU protection to avoid possible UAF. > > Fixes: de09334b9326 ("ndisc: Introduce ndisc_alloc_skb() helper.") > Signed-off-by: Eric Dumazet <edumazet@google.com> > --- > net/ipv6/ndisc.c | 10 ++++------ > 1 file changed, 4 insertions(+), 6 deletions(-) > Reviewed-by: David Ahern <dsahern@kernel.org>
From: Eric Dumazet <edumazet@google.com> Date: Fri, 7 Feb 2025 13:58:34 +0000 > ndisc_alloc_skb() can be called without RTNL or RCU being held. > > Add RCU protection to avoid possible UAF. > > Fixes: de09334b9326 ("ndisc: Introduce ndisc_alloc_skb() helper.") > Signed-off-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 264b10a94757705d4ce61e1371eb4d9a699b9016..90f8aa2d7af2ec1103220378c155b7b724efc575 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c @@ -418,15 +418,11 @@ static struct sk_buff *ndisc_alloc_skb(struct net_device *dev, { int hlen = LL_RESERVED_SPACE(dev); int tlen = dev->needed_tailroom; - struct sock *sk = dev_net(dev)->ipv6.ndisc_sk; struct sk_buff *skb; skb = alloc_skb(hlen + sizeof(struct ipv6hdr) + len + tlen, GFP_ATOMIC); - if (!skb) { - ND_PRINTK(0, err, "ndisc: %s failed to allocate an skb\n", - __func__); + if (!skb) return NULL; - } skb->protocol = htons(ETH_P_IPV6); skb->dev = dev; @@ -437,7 +433,9 @@ static struct sk_buff *ndisc_alloc_skb(struct net_device *dev, /* Manually assign socket ownership as we avoid calling * sock_alloc_send_pskb() to bypass wmem buffer limits */ - skb_set_owner_w(skb, sk); + rcu_read_lock(); + skb_set_owner_w(skb, dev_net_rcu(dev)->ipv6.ndisc_sk); + rcu_read_unlock(); return skb; }
ndisc_alloc_skb() can be called without RTNL or RCU being held. Add RCU protection to avoid possible UAF. Fixes: de09334b9326 ("ndisc: Introduce ndisc_alloc_skb() helper.") Signed-off-by: Eric Dumazet <edumazet@google.com> --- net/ipv6/ndisc.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)