diff options
| author | Lorenzo Colitti <lorenzo@google.com> | 2015-10-28 15:56:59 +0900 |
|---|---|---|
| committer | John Stultz <john.stultz@linaro.org> | 2016-02-16 13:51:44 -0800 |
| commit | 8bf4413b4f54e24120b90ecbfee426beeddc3ff0 (patch) | |
| tree | 10577131f8c2c390ac6ae10ba4025bfd66704a11 /net/ipv4/tcp.c | |
| parent | dcc8ef44353408913246228dc5f9b933d19c353a (diff) | |
Don't kill IPv4 sockets when killing IPv6 sockets was requested.
c7c3ec4903d32c60423ee013d96e94602f66042c cherry-picked the
tcp_nuke_addr ioctl, but omitted a check that ensures that a
socket is an IPv6 socket. This makes it so that if we issue a
SIOCKILLADDR on ::, it kills IPv4 sockets as well.
This is because every IPv4 socket has an IPv6 source address
(sk_v6_rcv_saddr) of ::. Thus, when we iterate over an IPv4
socket, and compare the source address of the socket to the
source address in the ioctl, it matches the :: that was passed
in, and we kill the socket.
Change-Id: I736431a898e6ec91536536d352936a210aa10100
Diffstat (limited to 'net/ipv4/tcp.c')
| -rw-r--r-- | net/ipv4/tcp.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index ced1683b2f3b..65dc38a429ae 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -3285,6 +3285,8 @@ restart: #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) if (family == AF_INET6) { struct in6_addr *s6; + if (!inet->pinet6) + continue; s6 = &sk->sk_v6_rcv_saddr; if (ipv6_addr_type(s6) == IPV6_ADDR_MAPPED) |
