ipv4: Put proper checks into icmp_socket_deliver().
authorDavid S. Miller <davem@davemloft.net>
Thu, 12 Jul 2012 15:06:04 +0000 (08:06 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 12 Jul 2012 15:06:04 +0000 (08:06 -0700)
All handler->err() routines expect that we've done a pskb_may_pull()
test to make sure that IP header length + 8 bytes can be safely
pulled.

Reported-by: Hiroaki SHIMODA <shimoda.hiroaki@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/icmp.c

index d01aeb4d492e474528b3e2cd6cee60e19a2c7236..ea3a996de95bdb3cab88c96ecb1369a8dc43e355 100644 (file)
@@ -640,6 +640,12 @@ static void icmp_socket_deliver(struct sk_buff *skb, u32 info)
        const struct net_protocol *ipprot;
        int protocol = iph->protocol;
 
+       /* Checkin full IP header plus 8 bytes of protocol to
+        * avoid additional coding at protocol handlers.
+        */
+       if (!pskb_may_pull(skb, iph->ihl * 4 + 8))
+               return;
+
        raw_icmp_error(skb, protocol, info);
 
        rcu_read_lock();
@@ -733,12 +739,6 @@ static void icmp_unreach(struct sk_buff *skb)
                goto out;
        }
 
-       /* Checkin full IP header plus 8 bytes of protocol to
-        * avoid additional coding at protocol handlers.
-        */
-       if (!pskb_may_pull(skb, iph->ihl * 4 + 8))
-               goto out;
-
        icmp_socket_deliver(skb, info);
 
 out: