• Rabin Vincent's avatar
    ipv6: Fix idev->addr_list corruption · a2d6cbb0
    Rabin Vincent authored
    addrconf_ifdown() removes elements from the idev->addr_list without
    holding the idev->lock.
    
    If this happens while the loop in __ipv6_dev_get_saddr() is handling the
    same element, that function ends up in an infinite loop:
    
      NMI watchdog: BUG: soft lockup - CPU#1 stuck for 23s! [test:1719]
      Call Trace:
       ipv6_get_saddr_eval+0x13c/0x3a0
       __ipv6_dev_get_saddr+0xe4/0x1f0
       ipv6_dev_get_saddr+0x1b4/0x204
       ip6_dst_lookup_tail+0xcc/0x27c
       ip6_dst_lookup_flow+0x38/0x80
       udpv6_sendmsg+0x708/0xba8
       sock_sendmsg+0x18/0x30
       SyS_sendto+0xb8/0xf8
       syscall_common+0x34/0x58
    
    Fixes: 6a923934 (Revert "ipv6: Revert optional address flusing on ifdown.")
    Signed-off-by: default avatarRabin Vincent <rabinv@axis.com>
    Acked-by: default avatarDavid Ahern <dsa@cumulusnetworks.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    a2d6cbb0
addrconf.c 156 KB