Patch "ipv6: lock socket in ip6_datagram_connect()" has been added to the 3.10-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 3.10-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-3.10 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:20:32 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
@@ -141,6 +141,7 @@ static inline struct sk_buff *ip_finish_ }/* datagram.c */ +int __ip4_datagram_connect (struct sock *sk,struct sockaddr *uaddr,int addr_len);extern int ip4_datagram_connect (struct sock *sk,struct sockaddr *uaddr,int addr_len);
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)) {
@@ -81,9 +79,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; }
@@ -99,9 +99,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); void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
Patches currently in stable-queue which might be from [email protected] are
queue-3.10/ipv6-lock-socket-in-ip6_datagram_connect.patch queue-3.10/net-fix-skb-csum-races-when-peeking.patch queue-3.10/inet-frags-fix-defragmented-packet-s-ip-header-for-af_packet.patch