diff options
author | Denis V. Lunev <den@openvz.org> | 2008-10-01 11:13:16 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-10-01 11:13:16 +0200 |
commit | 2a5b82751f73a0bf6f604ce56d34adba6da1b246 (patch) | |
tree | 7ebfa7df43f81ee8aca50263e5bb7f1beed3112f /net/ipv6/tcp_ipv6.c | |
parent | tcp: Fix NULL dereference in tcp_4_send_ack() (diff) | |
download | linux-2a5b82751f73a0bf6f604ce56d34adba6da1b246.tar.xz linux-2a5b82751f73a0bf6f604ce56d34adba6da1b246.zip |
ipv6: NULL pointer dereferrence in tcp_v6_send_ack
The following actions are possible:
tcp_v6_rcv
skb->dev = NULL;
tcp_v6_do_rcv
tcp_v6_hnd_req
tcp_check_req
req->rsk_ops->send_ack == tcp_v6_send_ack
So, skb->dev can be NULL in tcp_v6_send_ack. We must obtain namespace
from dst entry.
Thanks to Vitaliy Gusev <vgusev@openvz.org> for initial problem finding
in IPv4 code.
Signed-off-by: Denis V. Lunev <den@openvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index b585c850a89a..10e22fd48222 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -1050,7 +1050,7 @@ static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 struct tcphdr *th = tcp_hdr(skb), *t1; struct sk_buff *buff; struct flowi fl; - struct net *net = dev_net(skb->dev); + struct net *net = dev_net(skb->dst->dev); struct sock *ctl_sk = net->ipv6.tcp_sk; unsigned int tot_len = sizeof(struct tcphdr); __be32 *topt; |