]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - net/ipv4/udp.c
taprio: Add missing policy validation for flags
[linux.git] / net / ipv4 / udp.c
index 93a355b6b09242e9adc597e49589c6d0e4c71f71..db76b96092991cb3f0057035e0e051141511acd5 100644 (file)
@@ -1368,7 +1368,8 @@ static void udp_rmem_release(struct sock *sk, int size, int partial,
        if (likely(partial)) {
                up->forward_deficit += size;
                size = up->forward_deficit;
-               if (size < (sk->sk_rcvbuf >> 2))
+               if (size < (sk->sk_rcvbuf >> 2) &&
+                   !skb_queue_empty(&up->reader_queue))
                        return;
        } else {
                size += up->forward_deficit;
@@ -1708,7 +1709,8 @@ struct sk_buff *__skb_recv_udp(struct sock *sk, unsigned int flags,
 
                /* sk_queue is empty, reader_queue may contain peeked packets */
        } while (timeo &&
-                !__skb_wait_for_more_packets(sk, &error, &timeo,
+                !__skb_wait_for_more_packets(sk, &sk->sk_receive_queue,
+                                             &error, &timeo,
                                              (struct sk_buff *)sk_queue));
 
        *err = error;
@@ -2104,8 +2106,7 @@ static int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
        BUILD_BUG_ON(sizeof(struct udp_skb_cb) > SKB_SGO_CB_OFFSET);
        __skb_push(skb, -skb_mac_offset(skb));
        segs = udp_rcv_segment(sk, skb, true);
-       for (skb = segs; skb; skb = next) {
-               next = skb->next;
+       skb_list_walk_safe(segs, skb, next) {
                __skb_pull(skb, skb_transport_offset(skb));
                ret = udp_queue_rcv_one_skb(sk, skb);
                if (ret > 0)