X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fipv6%2Fudp.c;h=0dc7f0ec1feab8923ef0b9499002962d28257776;hb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;hp=17cf6dd878681ee7af724f97b55bc7a7df9c0532;hpb=c449269f45c2cdf53af08c8d0af37472f66539d9;p=linux-2.6.git diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 17cf6dd87..0dc7f0ec1 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -432,10 +432,8 @@ try_again: if (np->rxopt.all) datagram_recv_ctl(sk, msg, skb); - if (ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL) { - struct inet6_skb_parm *opt = (struct inet6_skb_parm *) skb->cb; - sin6->sin6_scope_id = opt->iif; - } + if (ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL) + sin6->sin6_scope_id = IP6CB(skb)->iif; } } err = copied; @@ -574,34 +572,26 @@ static void udpv6_mcast_deliver(struct udphdr *uh, struct sk_buff *skb) { struct sock *sk, *sk2; - struct sk_buff *buff; int dif; read_lock(&udp_hash_lock); sk = sk_head(&udp_hash[ntohs(uh->dest) & (UDP_HTABLE_SIZE - 1)]); dif = skb->dev->ifindex; sk = udp_v6_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif); - if (!sk) - goto free_skb; + if (!sk) { + kfree_skb(skb); + goto out; + } - buff = NULL; sk2 = sk; while ((sk2 = udp_v6_mcast_next(sk_next(sk2), uh->dest, daddr, uh->source, saddr, dif))) { - if (!buff) { - buff = skb_clone(skb, GFP_ATOMIC); - if (!buff) - continue; - } - if (udpv6_queue_rcv_skb(sk2, buff) >= 0) - buff = NULL; - } - if (buff) - kfree_skb(buff); - if (udpv6_queue_rcv_skb(sk, skb) < 0) { -free_skb: - kfree_skb(skb); + struct sk_buff *buff = skb_clone(skb, GFP_ATOMIC); + if (buff) + udpv6_queue_rcv_skb(sk2, buff); } + udpv6_queue_rcv_skb(sk, skb); +out: read_unlock(&udp_hash_lock); } @@ -1026,7 +1016,7 @@ static int udpv6_destroy_sock(struct sock *sk) * Socket option code for UDP */ static int udpv6_setsockopt(struct sock *sk, int level, int optname, - char *optval, int optlen) + char __user *optval, int optlen) { struct udp_opt *up = udp_sk(sk); int val; @@ -1038,7 +1028,7 @@ static int udpv6_setsockopt(struct sock *sk, int level, int optname, if(optlen