From 0d2bdc25847e9422f39752b455a632cee42221b3 Mon Sep 17 00:00:00 2001 From: "xeb@mail.ru" Date: Fri, 22 Jul 2011 20:49:40 +0000 Subject: [PATCH] --- yaml --- r: 258565 b: refs/heads/master c: 559fafb94ad9e4cd8774f39241917c57396f9fc5 h: refs/heads/master i: 258563: da1a7c37fba0be154daa3411df14a187bbce1a75 v: v3 --- [refs] | 2 +- trunk/net/ipv4/gre.c | 21 ++++++--------------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/[refs] b/[refs] index ebecf1ae6ac9..49134b92352d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b0fe4a31849063fcac0bdc93716ca92615e93f57 +refs/heads/master: 559fafb94ad9e4cd8774f39241917c57396f9fc5 diff --git a/trunk/net/ipv4/gre.c b/trunk/net/ipv4/gre.c index 9dbe10875fbd..dbfc21de3479 100644 --- a/trunk/net/ipv4/gre.c +++ b/trunk/net/ipv4/gre.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -96,27 +97,17 @@ static int gre_rcv(struct sk_buff *skb) static void gre_err(struct sk_buff *skb, u32 info) { const struct gre_protocol *proto; - u8 ver; - - if (!pskb_may_pull(skb, 12)) - goto drop; + const struct iphdr *iph = (const struct iphdr *)skb->data; + u8 ver = skb->data[(iph->ihl<<2) + 1]&0x7f; - ver = skb->data[1]&0x7f; if (ver >= GREPROTO_MAX) - goto drop; + return; rcu_read_lock(); proto = rcu_dereference(gre_proto[ver]); - if (!proto || !proto->err_handler) - goto drop_unlock; - proto->err_handler(skb, info); - rcu_read_unlock(); - return; - -drop_unlock: + if (proto && proto->err_handler) + proto->err_handler(skb, info); rcu_read_unlock(); -drop: - kfree_skb(skb); } static const struct net_protocol net_gre_protocol = {