Patch "ipv6: lock socket in ip6_datagram_connect()" has been added to the 4.1-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
ipv6: lock socket in ip6_datagram_connect()
to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
ipv6-lock-socket-in-ip6_datagram_connect.patch
and it can be found in the queue-4.1 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Sat Sep 26 11:13:07 PDT 2015
From: Eric Dumazet <[email protected]>
Date: Tue, 14 Jul 2015 08:10:22 +0200
Subject: ipv6: lock socket in ip6_datagram_connect()
From: Eric Dumazet <[email protected]>
[ Upstream commit 03645a11a570d52e70631838cb786eb4253eb463 ]
ip6_datagram_connect() is doing a lot of socket changes without socket being locked.
This looks wrong, at least for udp_lib_rehash() which could corrupt lists because of concurrent udp_sk(sk)->udp_portaddr_hash accesses.
--- include/net/ip.h | 1 + net/ipv4/datagram.c | 16 ++++++++++++---- net/ipv6/datagram.c | 20 +++++++++++++++----- 3 files changed, 28 insertions(+), 9 deletions(-)
include/net/ip.h +1 -0
@@ -161,6 +161,7 @@ static inline __u8 get_rtconn_flags(stru }/* datagram.c */ +int __ip4_datagram_connect (struct sock *sk,struct sockaddr *uaddr,int addr_len);int ip4_datagram_connect (struct sock *sk,struct sockaddr *uaddr,int addr_len);void ip4_datagram_release_cb (struct sock *sk);
net/ipv4/datagram.c +12 -4
@@ -20,7 +20,7 @@#include <net/route.h> #include <net/tcp_states.h> -int ip4_datagram_connect (struct sock *sk,struct sockaddr *uaddr,int addr_len) +int __ip4_datagram_connect (struct sock *sk,struct sockaddr *uaddr,int addr_len) {struct inet_sock *inet =inet_sk (sk);struct sockaddr_in *usin = (struct sockaddr_in *) uaddr;
@@ -39,8 +39,6 @@ int ip4_datagram_connect(struct sock *sksk_dst_reset (sk); -lock_sock (sk); - oif = sk->sk_bound_dev_if; saddr = inet->inet_saddr;if (ipv4_is_multicast (usin->sin_addr.s_addr)) {
@@ -82,9 +80,19 @@ int ip4_datagram_connect(struct sock *sksk_dst_set (sk, &rt->dst); err =0 ; out: -release_sock (sk);return err; } +EXPORT_SYMBOL (__ip4_datagram_connect); + +int ip4_datagram_connect (struct sock *sk,struct sockaddr *uaddr,int addr_len) +{ +int res; + +lock_sock (sk); + res =__ip4_datagram_connect (sk, uaddr, addr_len); +release_sock (sk); +return res; +}EXPORT_SYMBOL (ip4_datagram_connect);/* Because UDP xmit path can manipulate sk_dst_cache without holding
net/ipv6/datagram.c +15 -5
@@ -40,7 +40,7 @@ static bool ipv6_mapped_addr_any(const sreturn ipv6_addr_v4mapped (a) && (a->s6_addr32[3 ] ==0 ); } -int ip6_datagram_connect (struct sock *sk,struct sockaddr *uaddr,int addr_len) +static int __ip6_datagram_connect (struct sock *sk,struct sockaddr *uaddr,int addr_len) {struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;struct inet_sock *inet =inet_sk (sk);
@@ -56,7 +56,7 @@ int ip6_datagram_connect(struct sock *skif (usin->sin6_family ==AF_INET ) {if (__ipv6_only_sock (sk))return -EAFNOSUPPORT ; - err =ip4_datagram_connect (sk, uaddr, addr_len); + err =__ip4_datagram_connect (sk, uaddr, addr_len); goto ipv4_connected; }
@@ -98,9 +98,9 @@ int ip6_datagram_connect(struct sock *sk sin.sin_addr.s_addr = daddr->s6_addr32[3 ]; sin.sin_port = usin->sin6_port; - err =ip4_datagram_connect (sk, - (struct sockaddr *) &sin, -sizeof (sin)); + err =__ip4_datagram_connect (sk, + (struct sockaddr *) &sin, +sizeof (sin)); ipv4_connected:if (err)
@@ -204,6 +204,16 @@ out:fl6_sock_release (flowlabel);return err; } + +int ip6_datagram_connect (struct sock *sk,struct sockaddr *uaddr,int addr_len) +{ +int res; + +lock_sock (sk); + res =__ip6_datagram_connect (sk, uaddr, addr_len); +release_sock (sk); +return res; +}EXPORT_SYMBOL_GPL (ip6_datagram_connect); int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *uaddr,
Patches currently in stable-queue which might be from [email protected] are
queue-4.1/udp-fix-dst-races-with-multicast-early-demux.patch queue-4.1/fq_codel-fix-a-use-after-free.patch queue-4.1/inet-fix-possible-request-socket-leak.patch queue-4.1/ipv6-lock-socket-in-ip6_datagram_connect.patch queue-4.1/net-fix-skb-csum-races-when-peeking.patch queue-4.1/inet-fix-races-with-reqsk-timers.patch queue-4.1/net-graceful-exit-from-netif_alloc_netdev_queues.patch queue-4.1/bridge-fix-potential-crash-in-__netdev_pick_tx.patch queue-4.1/inet-frags-fix-defragmented-packet-s-ip-header-for-af_packet.patch