Commit a2d6cbb
ipv6: Fix idev->addr_list corruption
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: 6a92393 (Revert "ipv6: Revert optional address flusing on ifdown.")
Signed-off-by: Rabin Vincent <[email protected]>
Acked-by: David Ahern <[email protected]>
Signed-off-by: David S. Miller <[email protected]>1 parent df7dd8f commit a2d6cbb
1 file changed
+7
-4
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3626 | 3626 | | |
3627 | 3627 | | |
3628 | 3628 | | |
| 3629 | + | |
3629 | 3630 | | |
3630 | 3631 | | |
3631 | 3632 | | |
| 3633 | + | |
| 3634 | + | |
| 3635 | + | |
| 3636 | + | |
| 3637 | + | |
3632 | 3638 | | |
3633 | 3639 | | |
3634 | 3640 | | |
3635 | | - | |
3636 | | - | |
| 3641 | + | |
3637 | 3642 | | |
3638 | 3643 | | |
3639 | 3644 | | |
| |||
3645 | 3650 | | |
3646 | 3651 | | |
3647 | 3652 | | |
3648 | | - | |
3649 | | - | |
3650 | 3653 | | |
3651 | 3654 | | |
3652 | 3655 | | |
| |||
0 commit comments