]> pilppa.com Git - linux-2.6-omap-h63xx.git/commitdiff
udp: Fix UDP short packet false positive
authorJesper Dangaard Brouer <hawk@comx.dk>
Thu, 5 Feb 2009 23:05:45 +0000 (15:05 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 5 Feb 2009 23:05:45 +0000 (15:05 -0800)
The UDP header pointer assignment must happen after calling
pskb_may_pull().  As pskb_may_pull() can potentially alter the SKB
buffer.

This was exposted by running multicast traffic through the NIU driver,
as it won't prepull the protocol headers into the linear area on
receive.

Signed-off-by: Jesper Dangaard Brouer <hawk@comx.dk>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/udp.c

index 1ab180bad72a11195f0997ff6d15d77ce9fd5713..cc3a0a06c004df7eb933ca53c3bf05764aeb487e 100644 (file)
@@ -1231,7 +1231,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
                   int proto)
 {
        struct sock *sk;
-       struct udphdr *uh = udp_hdr(skb);
+       struct udphdr *uh;
        unsigned short ulen;
        struct rtable *rt = (struct rtable*)skb->dst;
        __be32 saddr = ip_hdr(skb)->saddr;
@@ -1244,6 +1244,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
        if (!pskb_may_pull(skb, sizeof(struct udphdr)))
                goto drop;              /* No space for header. */
 
+       uh   = udp_hdr(skb);
        ulen = ntohs(uh->len);
        if (ulen > skb->len)
                goto short_packet;