• Eric Dumazet's avatar
    net/smc: fix ref_tracker issue in smc_pnet_add() · 28f92221
    Eric Dumazet authored
    I added the netdev_tracker_alloc() right after ndev was
    stored into the newly allocated object:
    
      new_pe->ndev = ndev;
      if (ndev)
          netdev_tracker_alloc(ndev, &new_pe->dev_tracker, GFP_KERNEL);
    
    But I missed that later, we could end up freeing new_pe,
    then calling dev_put(ndev) to release the reference on ndev.
    
    The new_pe->dev_tracker would not be freed.
    
    To solve this issue, move the netdev_tracker_alloc() call to
    the point we know for sure new_pe will be kept.
    
    syzbot report (on net-next tree, but the bug is present in net tree)
    WARNING: CPU: 0 PID: 6019 at lib/refcount.c:31 refcount_warn_saturate+0xbf/0x1e0 lib/refcount.c:31
    Modules linked in:
    CPU: 0 PID: 6019 Comm: syz-executor.3 Not tainted 5.17.0-rc2-syzkaller-00650-g5a8fb33e #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    RIP: 0010:refcount_warn_saturate+0xbf/0x1e0 lib/refcount.c:31
    Code: 1d f4 70 a0 09 31 ff 89 de e8 4d bc 99 fd 84 db 75 e0 e8 64 b8 99 fd 48 c7 c7 20 0c 06 8a c6 05 d4 70 a0 09 01 e8 9e 4e 28 05 <0f> 0b eb c4 e8 48 b8 99 fd 0f b6 1d c3 70 a0 09 31 ff 89 de e8 18
    RSP: 0018:ffffc900043b7400 EFLAGS: 00010282
    RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
    RDX: 0000000000040000 RSI: ffffffff815fb318 RDI: fffff52000876e72
    RBP: 0000000000000004 R08: 0000000000000000 R09: 0000000000000000
    R10: ffffffff815f507e R11: 0000000000000000 R12: 1ffff92000876e85
    R13: 0000000000000000 R14: ffff88805c1c6600 R15: 0000000000000000
    FS:  00007f1ef6feb700(0000) GS:ffff8880b9c00000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 0000001b2d02b000 CR3: 00000000223f4000 CR4: 00000000003506f0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
     <TASK>
     __refcount_dec include/linux/refcount.h:344 [inline]
     refcount_dec include/linux/refcount.h:359 [inline]
     ref_tracker_free+0x53f/0x6c0 lib/ref_tracker.c:119
     netdev_tracker_free include/linux/netdevice.h:3867 [inline]
     dev_put_track include/linux/netdevice.h:3884 [inline]
     dev_put_track include/linux/netdevice.h:3880 [inline]
     dev_put include/linux/netdevice.h:3910 [inline]
     smc_pnet_add_eth net/smc/smc_pnet.c:399 [inline]
     smc_pnet_enter net/smc/smc_pnet.c:493 [inline]
     smc_pnet_add+0x5fc/0x15f0 net/smc/smc_pnet.c:556
     genl_family_rcv_msg_doit+0x228/0x320 net/netlink/genetlink.c:731
     genl_family_rcv_msg net/netlink/genetlink.c:775 [inline]
     genl_rcv_msg+0x328/0x580 net/netlink/genetlink.c:792
     netlink_rcv_skb+0x153/0x420 net/netlink/af_netlink.c:2494
     genl_rcv+0x24/0x40 net/netlink/genetlink.c:803
     netlink_unicast_kernel net/netlink/af_netlink.c:1317 [inline]
     netlink_unicast+0x539/0x7e0 net/netlink/af_netlink.c:1343
     netlink_sendmsg+0x904/0xe00 net/netlink/af_netlink.c:1919
     sock_sendmsg_nosec net/socket.c:705 [inline]
     sock_sendmsg+0xcf/0x120 net/socket.c:725
     ____sys_sendmsg+0x6e8/0x810 net/socket.c:2413
     ___sys_sendmsg+0xf3/0x170 net/socket.c:2467
     __sys_sendmsg+0xe5/0x1b0 net/socket.c:2496
     do_syscall_x64 arch/x86/entry/common.c:50 [inline]
     do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Fixes: b6064524 ("net/smc: add net device tracker to struct smc_pnetentry")
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Reported-by: default avatarsyzbot <syzkaller@googlegroups.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    28f92221
smc_pnet.c 30 KB