ipv4: fix a potential use after free in gre_offload.c
authorLi RongQing <roy.qing.li@gmail.com>
Sat, 18 Oct 2014 09:26:04 +0000 (17:26 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 18 Oct 2014 17:04:08 +0000 (13:04 -0400)
pskb_may_pull() may change skb->data and make greh pointer oboslete;
so need to reassign greh;
but since first calling pskb_may_pull already ensured that skb->data
has enough space for greh, so move the reference of greh before second
calling pskb_may_pull(), to avoid reassign greh.

Fixes: 7a7ffbabf9("ipv4: fix tunneled VM traffic over hw VXLAN/GRE GSO NIC")
Cc: Wei-Chun Chao <weichunc@plumgrid.com>
Signed-off-by: Li RongQing <roy.qing.li@gmail.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/gre_offload.c

index a777295030716930a8ec6ef90f121f363f859683..ccda09628de7e74f0f4f123bc3834afd12fd69a8 100644 (file)
@@ -55,13 +55,13 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
        if (csum)
                skb->encap_hdr_csum = 1;
 
-       if (unlikely(!pskb_may_pull(skb, ghl)))
-               goto out;
-
        /* setup inner skb. */
        skb->protocol = greh->protocol;
        skb->encapsulation = 0;
 
+       if (unlikely(!pskb_may_pull(skb, ghl)))
+               goto out;
+
        __skb_pull(skb, ghl);
        skb_reset_mac_header(skb);
        skb_set_network_header(skb, skb_inner_network_offset(skb));