patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / net / ipv6 / udp.c
index 17cf6dd..0dc7f0e 100644 (file)
@@ -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<sizeof(int))
                return -EINVAL;
 
-       if (get_user(val, (int *)optval))
+       if (get_user(val, (int __user *)optval))
                return -EFAULT;
 
        switch(optname) {
@@ -1066,7 +1056,7 @@ static int udpv6_setsockopt(struct sock *sk, int level, int optname,
 }
 
 static int udpv6_getsockopt(struct sock *sk, int level, int optname, 
-                         char *optval, int *optlen)
+                         char __user *optval, int __user *optlen)
 {
        struct udp_opt *up = udp_sk(sk);
        int val, len;