• Eric Dumazet's avatar
    net: initialize net->notrefcnt_tracker earlier · 6e77a5a4
    Eric Dumazet authored
    syzbot was able to trigger a warning [1] from net_free()
    calling ref_tracker_dir_exit(&net->notrefcnt_tracker)
    while the corresponding ref_tracker_dir_init() has not been
    done yet.
    
    copy_net_ns() can indeed bypass the call to setup_net()
    in some error conditions.
    
    Note:
    
    We might factorize/move more code in preinit_net() in the future.
    
    [1]
    INFO: trying to register non-static key.
    The code is fine but needs lockdep annotation, or maybe
    you didn't initialize this object before use?
    turning off the locking correctness validator.
    CPU: 0 PID: 5817 Comm: syz-executor.3 Not tainted 6.2.0-rc7-next-20230208-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/12/2023
    Call Trace:
    <TASK>
    __dump_stack lib/dump_stack.c:88 [inline]
    dump_stack_lvl+0xd9/0x150 lib/dump_stack.c:106
    assign_lock_key kernel/locking/lockdep.c:982 [inline]
    register_lock_class+0xdb6/0x1120 kernel/locking/lockdep.c:1295
    __lock_acquire+0x10a/0x5df0 kernel/locking/lockdep.c:4951
    lock_acquire.part.0+0x11c/0x370 kernel/locking/lockdep.c:5691
    __raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline]
    _raw_spin_lock_irqsave+0x3d/0x60 kernel/locking/spinlock.c:162
    ref_tracker_dir_exit+0x52/0x600 lib/ref_tracker.c:24
    net_free net/core/net_namespace.c:442 [inline]
    net_free+0x98/0xd0 net/core/net_namespace.c:436
    copy_net_ns+0x4f3/0x6b0 net/core/net_namespace.c:493
    create_new_namespaces+0x3f6/0xb20 kernel/nsproxy.c:110
    unshare_nsproxy_namespaces+0xc1/0x1f0 kernel/nsproxy.c:228
    ksys_unshare+0x449/0x920 kernel/fork.c:3205
    __do_sys_unshare kernel/fork.c:3276 [inline]
    __se_sys_unshare kernel/fork.c:3274 [inline]
    __x64_sys_unshare+0x31/0x40 kernel/fork.c:3274
    do_syscall_x64 arch/x86/entry/common.c:50 [inline]
    do_syscall_64+0x39/0xb0 arch/x86/entry/common.c:80
    
    Fixes: 0cafd77d ("net: add a refcount tracker for kernel sockets")
    Reported-by: default avatarsyzbot <syzkaller@googlegroups.com>
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Link: https://lore.kernel.org/r/20230208182123.3821604-1-edumazet@google.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    6e77a5a4
net_namespace.c 32.9 KB