summaryrefslogtreecommitdiff
path: root/net/ipv6/udp_impl.h
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2013-05-09 14:28:16 +0400
committerDavid S. Miller <davem@davemloft.net>2013-05-12 03:26:38 +0400
commitf77d602124d865c38705df7fa25c03de9c284ad2 (patch)
tree173c11c4c8bfe13a891dcee6bf546c2bc4c9ed76 /net/ipv6/udp_impl.h
parent233c7df0821c4190e2d3f4be0f2ca0ab40a5ed8c (diff)
downloadlinux-f77d602124d865c38705df7fa25c03de9c284ad2.tar.xz
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 fcbdf09d9652c891 ("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>
Diffstat (limited to 'net/ipv6/udp_impl.h')
-rw-r--r--net/ipv6/udp_impl.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/net/ipv6/udp_impl.h b/net/ipv6/udp_impl.h
index d7571046bfc4..4691ed50a928 100644
--- a/net/ipv6/udp_impl.h
+++ b/net/ipv6/udp_impl.h
@@ -31,6 +31,8 @@ extern int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk,
extern int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb);
extern void udpv6_destroy_sock(struct sock *sk);
+extern void udp_v6_clear_sk(struct sock *sk, int size);
+
#ifdef CONFIG_PROC_FS
extern int udp6_seq_show(struct seq_file *seq, void *v);
#endif