udp: remove headers from UDP packets before queueing
[deliverable/linux.git] / net / ipv6 / udp.c
index 78a7dfd127072e9205f8cc65fda51ea982b920a1..84c8d7b668203298b96d28b16307c23d501ae547 100644 (file)
@@ -376,7 +376,7 @@ try_again:
        if (!skb)
                goto out;
 
-       ulen = skb->len - sizeof(struct udphdr);
+       ulen = skb->len;
        copied = len;
        if (copied > ulen)
                copied = ulen;
@@ -398,10 +398,9 @@ try_again:
        }
 
        if (checksum_valid || skb_csum_unnecessary(skb))
-               err = skb_copy_datagram_msg(skb, sizeof(struct udphdr),
-                                           msg, copied);
+               err = skb_copy_datagram_msg(skb, 0, msg, copied);
        else {
-               err = skb_copy_and_csum_datagram_msg(skb, sizeof(struct udphdr), msg);
+               err = skb_copy_and_csum_datagram_msg(skb, 0, msg);
                if (err == -EINVAL)
                        goto csum_copy_err;
        }
@@ -554,7 +553,7 @@ static int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
                sk_incoming_cpu_update(sk);
        }
 
-       rc = sock_queue_rcv_skb(sk, skb);
+       rc = __sock_queue_rcv_skb(sk, skb);
        if (rc < 0) {
                int is_udplite = IS_UDPLITE(sk);
 
@@ -648,8 +647,11 @@ int udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
        if (rcu_access_pointer(sk->sk_filter)) {
                if (udp_lib_checksum_complete(skb))
                        goto csum_error;
+               if (sk_filter(sk, skb))
+                       goto drop;
        }
 
+       udp_csum_pull_header(skb);
        if (sk_rcvqueues_full(sk, sk->sk_rcvbuf)) {
                UDP6_INC_STATS_BH(sock_net(sk),
                                  UDP_MIB_RCVBUFERRORS, is_udplite);
This page took 0.050056 seconds and 5 git commands to generate.