Patch "ipv6: Handle IPv4-mapped src to in6addr_any dst." has been added to the 3.18-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
ipv6: Handle IPv4-mapped src to in6addr_any dst.
to the 3.18-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-handle-ipv4-mapped-src-to-in6addr_any-dst.patch
and it can be found in the queue-3.18 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 Thu Jun 15 09:38:54 CEST 2017
From: "Jonathan T. Leighton" <[email protected]>
Date: Tue, 23 May 2017 21:53:33 -0400
Subject: ipv6: Handle IPv4-mapped src to in6addr_any dst.
From: "Jonathan T. Leighton" <[email protected]>
[ Upstream commit 052d2369d1b479cdbbe020fdd6d057d3c342db74 ]
This patch adds a check on the type of the source address for the case where the destination address is in6addr_any. If the source is an IPv4-mapped IPv6 source address, the destination is changed to ::ffff:127.0.0.1, and otherwise the destination is changed to ::1. This is done in three locations to handle UDP calls to either connect() or sendmsg() and TCP calls to connect(). Note that udpv6_sendmsg() delays handling an in6addr_any destination until very late, so the patch only needs to handle the case where the source is an IPv4-mapped IPv6 address.
--- net/ipv6/datagram.c | 14 +++++++++----- net/ipv6/tcp_ipv6.c | 11 ++++++++--- net/ipv6/udp.c | 4 ++++ 3 files changed, 21 insertions(+), 8 deletions(-)
net/ipv6/datagram.c +9 -5
@@ -76,18 +76,22 @@ static int __ip6_datagram_connect(struct } } - addr_type =ipv6_addr_type (&usin->sin6_addr); - -if (addr_type ==IPV6_ADDR_ANY ) { +if (ipv6_addr_any (&usin->sin6_addr)) {/* * connect to self */ - usin->sin6_addr.s6_addr[15 ] =0x01 ; +if (ipv6_addr_v4mapped (&sk->sk_v6_rcv_saddr)) +ipv6_addr_set_v4mapped (htonl (INADDR_LOOPBACK ), + &usin->sin6_addr); +else + usin->sin6_addr = in6addr_loopback; } + addr_type =ipv6_addr_type (&usin->sin6_addr); + daddr = &usin->sin6_addr; -if (addr_type ==IPV6_ADDR_MAPPED ) { +if (addr_type &IPV6_ADDR_MAPPED ) {struct sockaddr_in sin;if (__ipv6_only_sock (sk)) {
net/ipv6/tcp_ipv6.c +8 -3
@@ -164,8 +164,13 @@ static int tcp_v6_connect(struct sock *s* connect() to INADDR_ANY means loopback (BSD'ism). */ -if (ipv6_addr_any (&usin->sin6_addr)) - usin->sin6_addr.s6_addr[15 ] =0x1 ; +if (ipv6_addr_any (&usin->sin6_addr)) { +if (ipv6_addr_v4mapped (&sk->sk_v6_rcv_saddr)) +ipv6_addr_set_v4mapped (htonl (INADDR_LOOPBACK ), + &usin->sin6_addr); +else + usin->sin6_addr = in6addr_loopback; + } addr_type =ipv6_addr_type (&usin->sin6_addr);
@@ -204,7 +209,7 @@ static int tcp_v6_connect(struct sock *s* TCP over IPv4 */ -if (addr_type ==IPV6_ADDR_MAPPED ) { +if (addr_type &IPV6_ADDR_MAPPED ) {u32 exthdrlen = icsk->icsk_ext_hdr_len;struct sockaddr_in sin;
net/ipv6/udp.c +4 -0
@@ -1107,6 +1107,10 @@ int udpv6_sendmsg(struct kiocb *iocb, stif (addr_len <SIN6_LEN_RFC2133 )return -EINVAL ; daddr = &sin6->sin6_addr; +if (ipv6_addr_any (daddr) && +ipv6_addr_v4mapped (&np->saddr)) +ipv6_addr_set_v4mapped (htonl (INADDR_LOOPBACK ), + daddr);break ;case AF_INET : goto do_udp_sendmsg;
Patches currently in stable-queue which might be from [email protected] are
queue-3.18/ipv6-inhibit-ipv4-mapped-src-address-on-the-wire.patch queue-3.18/ipv6-handle-ipv4-mapped-src-to-in6addr_any-dst.patch