FAILED: patch "[PATCH] net-timestamp: convert sk->sk_tskey to atomic_t" failed to apply to 5.4-stable tree
Subsystems (6)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a1cdec57e03a1352e92fbbe7974039dda4efcec0 Mon Sep 17 00:00:00 2001
From: Eric Dumazet <[email protected]>
Date: Thu, 17 Feb 2022 09:05:02 -0800
Subject: [PATCH] net-timestamp: convert sk->sk_tskey to atomic_t
UDP sendmsg() can be lockless, this is causing all kinds of data races.
This patch converts sk->sk_tskey to remove one of these races.
BUG: KCSAN: data-race in __ip_append_data / __ip_append_data
read to 0xffff8881035d4b6c of 4 bytes by task 8877 on cpu 1:
__ip_append_data+0x1c1/0x1de0 net/ipv4/ip_output.c:994 ip_make_skb+0x13f/0x2d0 net/ipv4/ip_output.c:1636 udp_sendmsg+0x12bd/0x14c0 net/ipv4/udp.c:1249 inet_sendmsg+0x5f/0x80 net/ipv4/af_inet.c:819 sock_sendmsg_nosec net/socket.c:705 [inline] sock_sendmsg net/socket.c:725 [inline] ____sys_sendmsg+0x39a/0x510 net/socket.c:2413 ___sys_sendmsg net/socket.c:2467 [inline] __sys_sendmmsg+0x267/0x4c0 net/socket.c:2553 __do_sys_sendmmsg net/socket.c:2582 [inline] __se_sys_sendmmsg net/socket.c:2579 [inline] __x64_sys_sendmmsg+0x53/0x60 net/socket.c:2579 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x44/0xd0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x44/0xae
write to 0xffff8881035d4b6c of 4 bytes by task 8880 on cpu 0:
__ip_append_data+0x1d8/0x1de0 net/ipv4/ip_output.c:994 ip_make_skb+0x13f/0x2d0 net/ipv4/ip_output.c:1636 udp_sendmsg+0x12bd/0x14c0 net/ipv4/udp.c:1249 inet_sendmsg+0x5f/0x80 net/ipv4/af_inet.c:819 sock_sendmsg_nosec net/socket.c:705 [inline] sock_sendmsg net/socket.c:725 [inline] ____sys_sendmsg+0x39a/0x510 net/socket.c:2413 ___sys_sendmsg net/socket.c:2467 [inline] __sys_sendmmsg+0x267/0x4c0 net/socket.c:2553 __do_sys_sendmmsg net/socket.c:2582 [inline] __se_sys_sendmmsg net/socket.c:2579 [inline] __x64_sys_sendmmsg+0x53/0x60 net/socket.c:2579 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x44/0xd0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x44/0xae
value changed: 0x0000054d -> 0x0000054e
Reported by Kernel Concurrency Sanitizer on:
CPU: 0 PID: 8880 Comm: syz-executor.5 Not tainted 5.17.0-rc2-syzkaller-00167-gdcb85f85fa6f-dirty #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
include/net/sock.h +2 -2
@@ -507,7 +507,7 @@ struct sock {#endif u16 sk_tsflags;u8 sk_shutdown; -u32 sk_tskey; +atomic_t sk_tskey;atomic_t sk_zckey;u8 sk_clockid;
@@ -2667,7 +2667,7 @@ static inline void _sock_tx_timestamp(struct sock *sk, __u16 tsflags,__sock_tx_timestamp (tsflags, tx_flags);if (tsflags &SOF_TIMESTAMPING_OPT_ID && tskey && tsflags &SOF_TIMESTAMPING_TX_RECORD_MASK ) - *tskey = sk->sk_tskey++; + *tskey =atomic_inc_return (&sk->sk_tskey) -1 ; }if (unlikely (sock_flag (sk,SOCK_WIFI_STATUS ))) *tx_flags |=SKBTX_WIFI_STATUS ;
net/can/j1939/transport.c +1 -1
@@ -2006,7 +2006,7 @@ struct j1939_session *j1939_tp_send(struct j1939_priv *priv,/* set the end-packet for broadcast */ session->pkt.last = session->pkt.total; - skcb->tskey = session->sk->sk_tskey++; + skcb->tskey =atomic_inc_return (&session->sk->sk_tskey) -1 ; session->tskey = skcb->tskey;return session;
net/core/skbuff.c +1 -1
@@ -4730,7 +4730,7 @@ static void __skb_complete_tx_timestamp(struct sk_buff *skb,if (sk->sk_tsflags &SOF_TIMESTAMPING_OPT_ID ) { serr->ee.ee_data =skb_shinfo (skb)->tskey;if (sk_is_tcp (sk)) - serr->ee.ee_data -= sk->sk_tskey; + serr->ee.ee_data -=atomic_read (&sk->sk_tskey); } err =sock_queue_err_skb (sk, skb);
net/core/sock.c +2 -2
@@ -879,9 +879,9 @@ int sock_set_timestamping(struct sock *sk, int optname,if ((1 << sk->sk_state) & (TCPF_CLOSE |TCPF_LISTEN ))return -EINVAL ; - sk->sk_tskey =tcp_sk (sk)->snd_una; +atomic_set (&sk->sk_tskey,tcp_sk (sk)->snd_una); }else { - sk->sk_tskey =0 ; +atomic_set (&sk->sk_tskey,0 ); } }
net/ipv4/ip_output.c +1 -1
@@ -991,7 +991,7 @@ static int __ip_append_data(struct sock *sk,if (cork->tx_flags &SKBTX_ANY_SW_TSTAMP && sk->sk_tsflags &SOF_TIMESTAMPING_OPT_ID ) - tskey = sk->sk_tskey++; + tskey =atomic_inc_return (&sk->sk_tskey) -1 ; hh_len =LL_RESERVED_SPACE (rt->dst.dev);
net/ipv6/ip6_output.c +1 -1
@@ -1465,7 +1465,7 @@ static int __ip6_append_data(struct sock *sk,if (cork->tx_flags &SKBTX_ANY_SW_TSTAMP && sk->sk_tsflags &SOF_TIMESTAMPING_OPT_ID ) - tskey = sk->sk_tskey++; + tskey =atomic_inc_return (&sk->sk_tskey) -1 ; hh_len =LL_RESERVED_SPACE (rt->dst.dev);