From: Eric Dumazet Date: Fri, 7 Jun 2019 19:23:48 +0000 (-0700) Subject: ipv6: tcp: fix potential NULL deref in tcp_v6_send_reset() X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=392096736a06bc9d8f2b42fd4bb1a44b245b9fed;p=openwrt%2Fstaging%2Fblogic.git ipv6: tcp: fix potential NULL deref in tcp_v6_send_reset() syzbot found a crash in tcp_v6_send_reset() caused by my latest change. Problem is that if an skb has been queued to socket prequeue, skb_dst(skb)->dev can not anymore point to the device. Fortunately in this case the socket pointer is not NULL. A similar issue has been fixed in commit 0f85feae6b71 ("tcp: fix more NULL deref after prequeue changes"), I should have known better. Fixes: 323a53c41292 ("ipv6: tcp: enable flowlabel reflection in some RST packets") Signed-off-by: Eric Dumazet Reported-by: syzbot Signed-off-by: David S. Miller --- diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index d8d18386c99a..c1da52c7f990 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -934,7 +934,7 @@ static void tcp_v6_send_reset(const struct sock *sk, struct sk_buff *skb) if (!sk && !ipv6_unicast_destination(skb)) return; - net = dev_net(skb_dst(skb)->dev); + net = sk ? sock_net(sk) : dev_net(skb_dst(skb)->dev); #ifdef CONFIG_TCP_MD5SIG rcu_read_lock(); hash_location = tcp_parse_md5sig_option(th);