[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CANn89iLLUwWGhQD9+LjQcaOMZ8c0Km+UcLenBamH0ftbKk=Gyg@mail.gmail.com>
Date: Sun, 13 Feb 2022 10:12:07 -0800
From: Eric Dumazet <edumazet@...gle.com>
To: Ido Schimmel <idosch@...sch.org>
Cc: Eric Dumazet <eric.dumazet@...il.com>,
"David S . Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>,
netdev <netdev@...r.kernel.org>,
Mahesh Bandewar <maheshb@...gle.com>
Subject: Re: [PATCH net-next 2/4] ipv6: give an IPv6 dev to blackhole_netdev
On Sun, Feb 13, 2022 at 10:05 AM Ido Schimmel <idosch@...sch.org> wrote:
>
> On Thu, Feb 10, 2022 at 01:42:29PM -0800, Eric Dumazet wrote:
> > diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
> > index 4f402bc38f056e08f3761e63a7bc7a51e54e9384..02d31d4fcab3b3d529c4fe3260216ecee1108e82 100644
> > --- a/net/ipv6/addrconf.c
> > +++ b/net/ipv6/addrconf.c
> > @@ -372,7 +372,7 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
> >
> > ASSERT_RTNL();
> >
> > - if (dev->mtu < IPV6_MIN_MTU)
> > + if (dev->mtu < IPV6_MIN_MTU && dev != blackhole_netdev)
> > return ERR_PTR(-EINVAL);
> >
> > ndev = kzalloc(sizeof(struct inet6_dev), GFP_KERNEL);
> > @@ -400,21 +400,22 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
> > /* We refer to the device */
> > dev_hold_track(dev, &ndev->dev_tracker, GFP_KERNEL);
> >
> > - if (snmp6_alloc_dev(ndev) < 0) {
> > - netdev_dbg(dev, "%s: cannot allocate memory for statistics\n",
> > - __func__);
> > - neigh_parms_release(&nd_tbl, ndev->nd_parms);
> > - dev_put_track(dev, &ndev->dev_tracker);
> > - kfree(ndev);
> > - return ERR_PTR(err);
> > - }
> > + if (dev != blackhole_netdev) {
> > + if (snmp6_alloc_dev(ndev) < 0) {
> > + netdev_dbg(dev, "%s: cannot allocate memory for statistics\n",
> > + __func__);
> > + neigh_parms_release(&nd_tbl, ndev->nd_parms);
> > + dev_put_track(dev, &ndev->dev_tracker);
> > + kfree(ndev);
> > + return ERR_PTR(err);
> > + }
>
> Hi,
>
> Our regression machines crashed with the following splat [1]. Can be
> reproduced with:
>
> # ./fib_nexthops.sh -t ipv6_torture
>
> From tools/testing/selftests/net
>
> Only had a couple of minutes (need to leave), but looks like the
> following patch helps [2]. I can continue working on it tomorrow
> morning, but wanted to mention it now in case you have a better idea /
> someone else bumps into the same issue.
>
> Thanks
>
> [1]
> [ 210.313674] ==================================================================
> [ 210.314672] BUG: KASAN: null-ptr-deref in __ip6_make_skb+0x17fb/0x20a0
> [ 210.315410] Write of size 8 at addr 0000000000000c00 by task ping/290
> [ 210.316183]
> [ 210.316359] CPU: 2 PID: 290 Comm: ping Not tainted 5.17.0-rc3-custom-02030-g17b65b552bb5 #1215
> [ 210.317335] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1.fc35 04/01/2014
> [ 210.318318] Call Trace:
> [ 210.318618] <TASK>
> [ 210.318876] dump_stack_lvl+0x8b/0xb3
> [ 210.319803] kasan_report.cold+0x116/0x11b
> [ 210.320876] kasan_check_range+0xf5/0x1d0
> [ 210.321348] __ip6_make_skb+0x17fb/0x20a0
> [ 210.323985] ip6_push_pending_frames+0xcd/0x110
> [ 210.324628] rawv6_sendmsg+0x29f5/0x37f0
> [ 210.329150] inet_sendmsg+0x9e/0xe0
> [ 210.329596] __sys_sendto+0x23d/0x360
> [ 210.333029] __x64_sys_sendto+0xe1/0x1b0
> [ 210.334542] do_syscall_64+0x35/0x80
> [ 210.334975] entry_SYSCALL_64_after_hwframe+0x44/0xae
> [ 210.335632] RIP: 0033:0x7f2d8cd2f3aa
> [ 210.336041] Code: d8 64 89 02 48 c7 c0 ff ff ff ff eb b8 0f 1f 00 f3 0f 1e fa 41 89 ca 64 8b 04 25 18 00 00 00 85 c0 75 15 b8 2c 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 7e c3 0f 1f 44 00 00 41 54 48 83 ec 30 44 89
> [ 210.338299] RSP: 002b:00007ffe1a5ec768 EFLAGS: 00000246 ORIG_RAX: 000000000000002c
> [ 210.339345] RAX: ffffffffffffffda RBX: 0000000000000038 RCX: 00007f2d8cd2f3aa
> [ 210.340207] RDX: 0000000000000040 RSI: 00007f2d8cfbb320 RDI: 0000000000000004
> [ 210.341284] RBP: 00007ffe1a5ec7f0 R08: 00007ffe1a5efee4 R09: 000000000000001c
> [ 210.342212] R10: 0000000000000800 R11: 0000000000000246 R12: 00007f2d8cebb480
> [ 210.343008] R13: 00007f2d8cea7f3d R14: 00007f2d8cea0c00 R15: 00007f2d8cebaa70
> [ 210.343785] </TASK>
> [ 210.344344] ==================================================================
>
> (gdb) l *(__ip6_make_skb+0x17fb)
> 0xffffffff8389fb5b is in __ip6_make_skb (./arch/x86/include/asm/atomic64_64.h:88).
> 83 *
> 84 * Atomically increments @v by 1.
> 85 */
> 86 static __always_inline void arch_atomic64_inc(atomic64_t *v)
> 87 {
> 88 asm volatile(LOCK_PREFIX "incq %0"
> 89 : "=m" (v->counter)
> 90 : "m" (v->counter) : "memory");
> 91 }
> 92 #define arch_atomic64_inc arch_atomic64_inc
>
> [2]
> diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
> index 02d31d4fcab3..57fbd6f03ff8 100644
> --- a/net/ipv6/addrconf.c
> +++ b/net/ipv6/addrconf.c
> @@ -400,16 +400,16 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
> /* We refer to the device */
> dev_hold_track(dev, &ndev->dev_tracker, GFP_KERNEL);
>
> - if (dev != blackhole_netdev) {
> - if (snmp6_alloc_dev(ndev) < 0) {
> - netdev_dbg(dev, "%s: cannot allocate memory for statistics\n",
> - __func__);
> - neigh_parms_release(&nd_tbl, ndev->nd_parms);
> - dev_put_track(dev, &ndev->dev_tracker);
> - kfree(ndev);
> - return ERR_PTR(err);
> - }
> + if (snmp6_alloc_dev(ndev) < 0) {
> + netdev_dbg(dev, "%s: cannot allocate memory for statistics\n",
> + __func__);
> + neigh_parms_release(&nd_tbl, ndev->nd_parms);
> + dev_put_track(dev, &ndev->dev_tracker);
> + kfree(ndev);
> + return ERR_PTR(err);
> + }
>
> + if (dev != blackhole_netdev) {
> if (snmp6_register_dev(ndev) < 0) {
> netdev_dbg(dev, "%s: cannot create /proc/net/dev_snmp6/%s\n",
> __func__, dev->name);
>
> >
> > - if (snmp6_register_dev(ndev) < 0) {
> > - netdev_dbg(dev, "%s: cannot create /proc/net/dev_snmp6/%s\n",
> > - __func__, dev->name);
> > - goto err_release;
> > + if (snmp6_register_dev(ndev) < 0) {
> > + netdev_dbg(dev, "%s: cannot create /proc/net/dev_snmp6/%s\n",
> > + __func__, dev->name);
> > + goto err_release;
> > + }
> > }
> > -
> > /* One reference from device. */
> > refcount_set(&ndev->refcnt, 1);
> >
> > @@ -445,25 +446,28 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
> >
> > ipv6_mc_init_dev(ndev);
> > ndev->tstamp = jiffies;
> > - err = addrconf_sysctl_register(ndev);
> > - if (err) {
> > - ipv6_mc_destroy_dev(ndev);
> > - snmp6_unregister_dev(ndev);
> > - goto err_release;
> > + if (dev != blackhole_netdev) {
> > + err = addrconf_sysctl_register(ndev);
> > + if (err) {
> > + ipv6_mc_destroy_dev(ndev);
> > + snmp6_unregister_dev(ndev);
> > + goto err_release;
> > + }
> > }
> > /* protected by rtnl_lock */
> > rcu_assign_pointer(dev->ip6_ptr, ndev);
> >
> > - /* Join interface-local all-node multicast group */
> > - ipv6_dev_mc_inc(dev, &in6addr_interfacelocal_allnodes);
> > + if (dev != blackhole_netdev) {
> > + /* Join interface-local all-node multicast group */
> > + ipv6_dev_mc_inc(dev, &in6addr_interfacelocal_allnodes);
> >
> > - /* Join all-node multicast group */
> > - ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes);
> > -
> > - /* Join all-router multicast group if forwarding is set */
> > - if (ndev->cnf.forwarding && (dev->flags & IFF_MULTICAST))
> > - ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters);
> > + /* Join all-node multicast group */
> > + ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes);
> >
> > + /* Join all-router multicast group if forwarding is set */
> > + if (ndev->cnf.forwarding && (dev->flags & IFF_MULTICAST))
> > + ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters);
> > + }
> > return ndev;
> >
> > err_release:
Hi Ido
I was coming to a similar conclusion, with an internal syzbot report.
Thanks.
Powered by blists - more mailing lists