aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2008-04-14 02:14:15 -0400
committerDavid S. Miller <davem@davemloft.net>2008-04-14 02:14:15 -0400
commitb45e9189c058bfa495073951ff461ee0eea968be (patch)
treea620ecd6443b456bdc4b2f0d144d11ee953b166d /net/ipv6
parent2ed9926e16094ad143b96b09c64cba8bcba05ee1 (diff)
[IPV6]: Fix ipv6 address fetching in raw6_icmp_error().
Fixes kernel bugzilla 10437 Based almost entirely upon a patch by Dmitry Butskoy. When deciding what raw sockets to deliver the ICMPv6 to, we should use the addresses in the ICMPv6 quoted IPV6 header, not the top-level one. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6')
-rw-r--r--net/ipv6/raw.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index 8897ccf8086a..0a6fbc1d1a50 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -372,8 +372,10 @@ void raw6_icmp_error(struct sk_buff *skb, int nexthdr,
372 read_lock(&raw_v6_hashinfo.lock); 372 read_lock(&raw_v6_hashinfo.lock);
373 sk = sk_head(&raw_v6_hashinfo.ht[hash]); 373 sk = sk_head(&raw_v6_hashinfo.ht[hash]);
374 if (sk != NULL) { 374 if (sk != NULL) {
375 saddr = &ipv6_hdr(skb)->saddr; 375 struct ipv6hdr *hdr = (struct ipv6hdr *) skb->data;
376 daddr = &ipv6_hdr(skb)->daddr; 376
377 saddr = &hdr->saddr;
378 daddr = &hdr->daddr;
377 net = skb->dev->nd_net; 379 net = skb->dev->nd_net;
378 380
379 while ((sk = __raw_v6_lookup(net, sk, nexthdr, saddr, daddr, 381 while ((sk = __raw_v6_lookup(net, sk, nexthdr, saddr, daddr,