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 fcbdf09d96
("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>
This commit is contained in:

committed by
David S. Miller

parent
233c7df082
commit
f77d602124
@@ -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
|
||||
|
Reference in New Issue
Block a user