diff options
author | David S. Miller <davem@davemloft.net> | 2008-04-14 02:14:15 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-04-14 02:14:15 -0400 |
commit | b45e9189c058bfa495073951ff461ee0eea968be (patch) | |
tree | a620ecd6443b456bdc4b2f0d144d11ee953b166d /net/ipv6 | |
parent | 2ed9926e16094ad143b96b09c64cba8bcba05ee1 (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.c | 6 |
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, |