aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/raw.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv6/raw.c')
-rw-r--r--net/ipv6/raw.c20
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