diff options
Diffstat (limited to 'net/ipv6/raw.c')
-rw-r--r-- | net/ipv6/raw.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 088b80b4ce74..6193b124cbc7 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -357,8 +357,10 @@ void raw6_icmp_error(struct sk_buff *skb, int nexthdr, | |||
357 | read_lock(&raw_v6_hashinfo.lock); | 357 | read_lock(&raw_v6_hashinfo.lock); |
358 | sk = sk_head(&raw_v6_hashinfo.ht[hash]); | 358 | sk = sk_head(&raw_v6_hashinfo.ht[hash]); |
359 | if (sk != NULL) { | 359 | if (sk != NULL) { |
360 | saddr = &ipv6_hdr(skb)->saddr; | 360 | /* Note: ipv6_hdr(skb) != skb->data */ |
361 | daddr = &ipv6_hdr(skb)->daddr; | 361 | struct ipv6hdr *ip6h = (struct ipv6hdr *)skb->data; |
362 | saddr = &ip6h->saddr; | ||
363 | daddr = &ip6h->daddr; | ||
362 | net = dev_net(skb->dev); | 364 | net = dev_net(skb->dev); |
363 | 365 | ||
364 | while ((sk = __raw_v6_lookup(net, sk, nexthdr, saddr, daddr, | 366 | while ((sk = __raw_v6_lookup(net, sk, nexthdr, saddr, daddr, |
@@ -805,15 +807,6 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
805 | fl.fl6_flowlabel = np->flow_label; | 807 | fl.fl6_flowlabel = np->flow_label; |
806 | } | 808 | } |
807 | 809 | ||
808 | if (ipv6_addr_any(daddr)) { | ||
809 | /* | ||
810 | * unspecified destination address | ||
811 | * treated as error... is this correct ? | ||
812 | */ | ||
813 | fl6_sock_release(flowlabel); | ||
814 | return(-EINVAL); | ||
815 | } | ||
816 | |||
817 | if (fl.oif == 0) | 810 | if (fl.oif == 0) |
818 | fl.oif = sk->sk_bound_dev_if; | 811 | fl.oif = sk->sk_bound_dev_if; |
819 | 812 | ||
@@ -846,7 +839,10 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
846 | if (err) | 839 | if (err) |
847 | goto out; | 840 | goto out; |
848 | 841 | ||
849 | ipv6_addr_copy(&fl.fl6_dst, daddr); | 842 | if (!ipv6_addr_any(daddr)) |
843 | ipv6_addr_copy(&fl.fl6_dst, daddr); | ||
844 | else | ||
845 | fl.fl6_dst.s6_addr[15] = 0x1; /* :: means loopback (BSD'ism) */ | ||
850 | if (ipv6_addr_any(&fl.fl6_src) && !ipv6_addr_any(&np->saddr)) | 846 | if (ipv6_addr_any(&fl.fl6_src) && !ipv6_addr_any(&np->saddr)) |
851 | ipv6_addr_copy(&fl.fl6_src, &np->saddr); | 847 | ipv6_addr_copy(&fl.fl6_src, &np->saddr); |
852 | 848 | ||