udp: add missing WRITE_ONCE() around up->encap_rcv
authorEric Dumazet <edumazet@google.com>
Tue, 12 Sep 2023 09:17:25 +0000 (09:17 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 20 Nov 2023 10:51:52 +0000 (11:51 +0100)
[ Upstream commit 6d5a12eb91224d707f8691dccb40a5719fe5466d ]

UDP_ENCAP_ESPINUDP_NON_IKE setsockopt() writes over up->encap_rcv
while other cpus read it.

Fixes: 067b207b281d ("[UDP]: Cleanup UDP encapsulation code")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/ipv4/udp.c

index b2aa777..65abc92 100644 (file)
@@ -2714,10 +2714,12 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
                case UDP_ENCAP_ESPINUDP_NON_IKE:
 #if IS_ENABLED(CONFIG_IPV6)
                        if (sk->sk_family == AF_INET6)
-                               up->encap_rcv = ipv6_stub->xfrm6_udp_encap_rcv;
+                               WRITE_ONCE(up->encap_rcv,
+                                          ipv6_stub->xfrm6_udp_encap_rcv);
                        else
 #endif
-                               up->encap_rcv = xfrm4_udp_encap_rcv;
+                               WRITE_ONCE(up->encap_rcv,
+                                          xfrm4_udp_encap_rcv);
 #endif
                        fallthrough;
                case UDP_ENCAP_L2TPINUDP: