Jiri Slaby 52366a
From: Eric Dumazet <edumazet@google.com>
Jiri Slaby 52366a
Date: Thu, 7 Nov 2019 20:08:19 -0800
Jiri Slaby 52366a
Subject: net: fix data-race in neigh_event_send()
Jiri Slaby 52366a
Git-commit: 1b53d64435d56902fc234ff2507142d971a09687
Jiri Slaby 52366a
Patch-mainline: 5.4-rc7
Jiri Slaby 52366a
References: networking-stable-19_11_10
Jiri Slaby 52366a
Jiri Slaby 52366a
KCSAN reported the following data-race [1]
Jiri Slaby 52366a
Jiri Slaby 52366a
The fix will also prevent the compiler from optimizing out
Jiri Slaby 52366a
the condition.
Jiri Slaby 52366a
Jiri Slaby 52366a
[1]
Jiri Slaby 52366a
Jiri Slaby 52366a
BUG: KCSAN: data-race in neigh_resolve_output / neigh_resolve_output
Jiri Slaby 52366a
Jiri Slaby 52366a
write to 0xffff8880a41dba78 of 8 bytes by interrupt on cpu 1:
Jiri Slaby 52366a
 neigh_event_send include/net/neighbour.h:443 [inline]
Jiri Slaby 52366a
 neigh_resolve_output+0x78/0x480 net/core/neighbour.c:1474
Jiri Slaby 52366a
 neigh_output include/net/neighbour.h:511 [inline]
Jiri Slaby 52366a
 ip_finish_output2+0x4af/0xe40 net/ipv4/ip_output.c:228
Jiri Slaby 52366a
 __ip_finish_output net/ipv4/ip_output.c:308 [inline]
Jiri Slaby 52366a
 __ip_finish_output+0x23a/0x490 net/ipv4/ip_output.c:290
Jiri Slaby 52366a
 ip_finish_output+0x41/0x160 net/ipv4/ip_output.c:318
Jiri Slaby 52366a
 NF_HOOK_COND include/linux/netfilter.h:294 [inline]
Jiri Slaby 52366a
 ip_output+0xdf/0x210 net/ipv4/ip_output.c:432
Jiri Slaby 52366a
 dst_output include/net/dst.h:436 [inline]
Jiri Slaby 52366a
 ip_local_out+0x74/0x90 net/ipv4/ip_output.c:125
Jiri Slaby 52366a
 __ip_queue_xmit+0x3a8/0xa40 net/ipv4/ip_output.c:532
Jiri Slaby 52366a
 ip_queue_xmit+0x45/0x60 include/net/ip.h:237
Jiri Slaby 52366a
 __tcp_transmit_skb+0xe81/0x1d60 net/ipv4/tcp_output.c:1169
Jiri Slaby 52366a
 tcp_transmit_skb net/ipv4/tcp_output.c:1185 [inline]
Jiri Slaby 52366a
 __tcp_retransmit_skb+0x4bd/0x15f0 net/ipv4/tcp_output.c:2976
Jiri Slaby 52366a
 tcp_retransmit_skb+0x36/0x1a0 net/ipv4/tcp_output.c:2999
Jiri Slaby 52366a
 tcp_retransmit_timer+0x719/0x16d0 net/ipv4/tcp_timer.c:515
Jiri Slaby 52366a
 tcp_write_timer_handler+0x42d/0x510 net/ipv4/tcp_timer.c:598
Jiri Slaby 52366a
 tcp_write_timer+0xd1/0xf0 net/ipv4/tcp_timer.c:618
Jiri Slaby 52366a
Jiri Slaby 52366a
read to 0xffff8880a41dba78 of 8 bytes by interrupt on cpu 0:
Jiri Slaby 52366a
 neigh_event_send include/net/neighbour.h:442 [inline]
Jiri Slaby 52366a
 neigh_resolve_output+0x57/0x480 net/core/neighbour.c:1474
Jiri Slaby 52366a
 neigh_output include/net/neighbour.h:511 [inline]
Jiri Slaby 52366a
 ip_finish_output2+0x4af/0xe40 net/ipv4/ip_output.c:228
Jiri Slaby 52366a
 __ip_finish_output net/ipv4/ip_output.c:308 [inline]
Jiri Slaby 52366a
 __ip_finish_output+0x23a/0x490 net/ipv4/ip_output.c:290
Jiri Slaby 52366a
 ip_finish_output+0x41/0x160 net/ipv4/ip_output.c:318
Jiri Slaby 52366a
 NF_HOOK_COND include/linux/netfilter.h:294 [inline]
Jiri Slaby 52366a
 ip_output+0xdf/0x210 net/ipv4/ip_output.c:432
Jiri Slaby 52366a
 dst_output include/net/dst.h:436 [inline]
Jiri Slaby 52366a
 ip_local_out+0x74/0x90 net/ipv4/ip_output.c:125
Jiri Slaby 52366a
 __ip_queue_xmit+0x3a8/0xa40 net/ipv4/ip_output.c:532
Jiri Slaby 52366a
 ip_queue_xmit+0x45/0x60 include/net/ip.h:237
Jiri Slaby 52366a
 __tcp_transmit_skb+0xe81/0x1d60 net/ipv4/tcp_output.c:1169
Jiri Slaby 52366a
 tcp_transmit_skb net/ipv4/tcp_output.c:1185 [inline]
Jiri Slaby 52366a
 __tcp_retransmit_skb+0x4bd/0x15f0 net/ipv4/tcp_output.c:2976
Jiri Slaby 52366a
 tcp_retransmit_skb+0x36/0x1a0 net/ipv4/tcp_output.c:2999
Jiri Slaby 52366a
 tcp_retransmit_timer+0x719/0x16d0 net/ipv4/tcp_timer.c:515
Jiri Slaby 52366a
 tcp_write_timer_handler+0x42d/0x510 net/ipv4/tcp_timer.c:598
Jiri Slaby 52366a
Jiri Slaby 52366a
Reported by Kernel Concurrency Sanitizer on:
Jiri Slaby 52366a
CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.4.0-rc3+ #0
Jiri Slaby 52366a
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Jiri Slaby 52366a
Jiri Slaby 52366a
Signed-off-by: Eric Dumazet <edumazet@google.com>
Jiri Slaby 52366a
Reported-by: syzbot <syzkaller@googlegroups.com>
Jiri Slaby 52366a
Signed-off-by: David S. Miller <davem@davemloft.net>
Jiri Slaby 52366a
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Jiri Slaby 52366a
---
Jiri Slaby 52366a
 include/net/neighbour.h |    4 ++--
Jiri Slaby 52366a
 1 file changed, 2 insertions(+), 2 deletions(-)
Jiri Slaby 52366a
Jiri Slaby 52366a
--- a/include/net/neighbour.h
Jiri Slaby 52366a
+++ b/include/net/neighbour.h
Jiri Slaby 52366a
@@ -427,8 +427,8 @@ static inline int neigh_event_send(struc
Jiri Slaby 52366a
 {
Jiri Slaby 52366a
 	unsigned long now = jiffies;
Jiri Slaby 52366a
 	
Jiri Slaby 52366a
-	if (neigh->used != now)
Jiri Slaby 52366a
-		neigh->used = now;
Jiri Slaby 52366a
+	if (READ_ONCE(neigh->used) != now)
Jiri Slaby 52366a
+		WRITE_ONCE(neigh->used, now);
Jiri Slaby 52366a
 	if (!(neigh->nud_state&(NUD_CONNECTED|NUD_DELAY|NUD_PROBE)))
Jiri Slaby 52366a
 		return __neigh_event_send(neigh, skb);
Jiri Slaby 52366a
 	return 0;