• Eric Dumazet's avatar
    ipv6: addrconf: increment ifp refcount before ipv6_del_addr() · e669b869
    Eric Dumazet authored
    In the (unlikely) event fixup_permanent_addr() returns a failure,
    addrconf_permanent_addr() calls ipv6_del_addr() without the
    mandatory call to in6_ifa_hold(), leading to a refcount error,
    spotted by syzkaller :
    
    WARNING: CPU: 1 PID: 3142 at lib/refcount.c:227 refcount_dec+0x4c/0x50
    lib/refcount.c:227
    Kernel panic - not syncing: panic_on_warn set ...
    
    CPU: 1 PID: 3142 Comm: ip Not tainted 4.14.0-rc4-next-20171009+ #33
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS
    Google 01/01/2011
    Call Trace:
     __dump_stack lib/dump_stack.c:16 [inline]
     dump_stack+0x194/0x257 lib/dump_stack.c:52
     panic+0x1e4/0x41c kernel/panic.c:181
     __warn+0x1c4/0x1e0 kernel/panic.c:544
     report_bug+0x211/0x2d0 lib/bug.c:183
     fixup_bug+0x40/0x90 arch/x86/kernel/traps.c:178
     do_trap_no_signal arch/x86/kernel/traps.c:212 [inline]
     do_trap+0x260/0x390 arch/x86/kernel/traps.c:261
     do_error_trap+0x120/0x390 arch/x86/kernel/traps.c:298
     do_invalid_op+0x1b/0x20 arch/x86/kernel/traps.c:311
     invalid_op+0x18/0x20 arch/x86/entry/entry_64.S:905
    RIP: 0010:refcount_dec+0x4c/0x50 lib/refcount.c:227
    RSP: 0018:ffff8801ca49e680 EFLAGS: 00010286
    RAX: 000000000000002c RBX: ffff8801d07cfcdc RCX: 0000000000000000
    RDX: 000000000000002c RSI: 1ffff10039493c90 RDI: ffffed0039493cc4
    RBP: ffff8801ca49e688 R08: ffff8801ca49dd70 R09: 0000000000000000
    R10: ffff8801ca49df58 R11: 0000000000000000 R12: 1ffff10039493cd9
    R13: ffff8801ca49e6e8 R14: ffff8801ca49e7e8 R15: ffff8801d07cfcdc
     __in6_ifa_put include/net/addrconf.h:369 [inline]
     ipv6_del_addr+0x42b/0xb60 net/ipv6/addrconf.c:1208
     addrconf_permanent_addr net/ipv6/addrconf.c:3327 [inline]
     addrconf_notify+0x1c66/0x2190 net/ipv6/addrconf.c:3393
     notifier_call_chain+0x136/0x2c0 kernel/notifier.c:93
     __raw_notifier_call_chain kernel/notifier.c:394 [inline]
     raw_notifier_call_chain+0x2d/0x40 kernel/notifier.c:401
     call_netdevice_notifiers_info+0x32/0x60 net/core/dev.c:1697
     call_netdevice_notifiers net/core/dev.c:1715 [inline]
     __dev_notify_flags+0x15d/0x430 net/core/dev.c:6843
     dev_change_flags+0xf5/0x140 net/core/dev.c:6879
     do_setlink+0xa1b/0x38e0 net/core/rtnetlink.c:2113
     rtnl_newlink+0xf0d/0x1a40 net/core/rtnetlink.c:2661
     rtnetlink_rcv_msg+0x733/0x1090 net/core/rtnetlink.c:4301
     netlink_rcv_skb+0x216/0x440 net/netlink/af_netlink.c:2408
     rtnetlink_rcv+0x1c/0x20 net/core/rtnetlink.c:4313
     netlink_unicast_kernel net/netlink/af_netlink.c:1273 [inline]
     netlink_unicast+0x4e8/0x6f0 net/netlink/af_netlink.c:1299
     netlink_sendmsg+0xa4a/0xe70 net/netlink/af_netlink.c:1862
     sock_sendmsg_nosec net/socket.c:633 [inline]
     sock_sendmsg+0xca/0x110 net/socket.c:643
     ___sys_sendmsg+0x75b/0x8a0 net/socket.c:2049
     __sys_sendmsg+0xe5/0x210 net/socket.c:2083
     SYSC_sendmsg net/socket.c:2094 [inline]
     SyS_sendmsg+0x2d/0x50 net/socket.c:2090
     entry_SYSCALL_64_fastpath+0x1f/0xbe
    RIP: 0033:0x7fa9174d3320
    RSP: 002b:00007ffe302ae9e8 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 00007ffe302b2ae0 RCX: 00007fa9174d3320
    RDX: 0000000000000000 RSI: 00007ffe302aea20 RDI: 0000000000000016
    RBP: 0000000000000082 R08: 0000000000000000 R09: 000000000000000f
    R10: 0000000000000000 R11: 0000000000000246 R12: 00007ffe302b32a0
    R13: 0000000000000000 R14: 00007ffe302b2ab8 R15: 00007ffe302b32b8
    
    Fixes: f1705ec1 ("net: ipv6: Make address flushing on ifdown optional")
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Cc: David Ahern <dsahern@gmail.com>
    Acked-by: default avatarDavid Ahern <dsahern@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    e669b869
addrconf.c 160 KB