]> git.baikalelectronics.ru Git - kernel.git/commit
ipv6: do not clear pinet6 field
authorEric Dumazet <edumazet@google.com>
Thu, 9 May 2013 10:28:16 +0000 (10:28 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sat, 11 May 2013 23:26:38 +0000 (16:26 -0700)
commit70065af74090fe6fbca8840e6d9bbe6178edf123
tree173c11c4c8bfe13a891dcee6bf546c2bc4c9ed76
parentdde53ce0fa3088617e6bab2744b3d077d2dc6660
ipv6: do not clear pinet6 field

We have seen multiple NULL dereferences in __inet6_lookup_established()

After analysis, I found that inet6_sk() could be NULL while the
check for sk_family == AF_INET6 was true.

Bug was added in linux-2.6.29 when RCU lookups were introduced in UDP
and TCP stacks.

Once an IPv6 socket, using SLAB_DESTROY_BY_RCU is inserted in a hash
table, we no longer can clear pinet6 field.

This patch extends logic used in commit 5d4f100bd842dfdd
("net: fix nulls list corruptions in sk_prot_alloc")

TCP/UDP/UDPLite IPv6 protocols provide their own .clear_sk() method
to make sure we do not clear pinet6 field.

At socket clone phase, we do not really care, as cloning the parent (non
NULL) pinet6 is not adding a fatal race.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/sock.h
net/core/sock.c
net/ipv6/tcp_ipv6.c
net/ipv6/udp.c
net/ipv6/udp_impl.h
net/ipv6/udplite.c