summaryrefslogtreecommitdiffstats
path: root/net/ipv4/ipmr.c
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2006-07-29 01:39:26 -0400
committerJeff Garzik <jeff@garzik.org>2006-07-29 01:39:26 -0400
commit5b85f29ca453d56d83cdffa075d615583bb8fb72 (patch)
treea553754dcef01a22a6bd6e2eeb2fd4eb69bf5b37 /net/ipv4/ipmr.c
parent48cb37bd9e053429aacb7c2726da3300aba60c68 (diff)
parentab3b3fd38125be0242c2f94bf144b48054210882 (diff)
downloadkernel-crypto-5b85f29ca453d56d83cdffa075d615583bb8fb72.tar.gz
kernel-crypto-5b85f29ca453d56d83cdffa075d615583bb8fb72.tar.xz
kernel-crypto-5b85f29ca453d56d83cdffa075d615583bb8fb72.zip
Merge branch 'upstream-fixes' into upstream
Diffstat (limited to 'net/ipv4/ipmr.c')
-rw-r--r--net/ipv4/ipmr.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
index 9ccacf57f08..85893eef6b1 100644
--- a/net/ipv4/ipmr.c
+++ b/net/ipv4/ipmr.c
@@ -1578,6 +1578,7 @@ int ipmr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait)
cache = ipmr_cache_find(rt->rt_src, rt->rt_dst);
if (cache==NULL) {
+ struct sk_buff *skb2;
struct net_device *dev;
int vif;
@@ -1591,12 +1592,18 @@ int ipmr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait)
read_unlock(&mrt_lock);
return -ENODEV;
}
- skb->nh.raw = skb_push(skb, sizeof(struct iphdr));
- skb->nh.iph->ihl = sizeof(struct iphdr)>>2;
- skb->nh.iph->saddr = rt->rt_src;
- skb->nh.iph->daddr = rt->rt_dst;
- skb->nh.iph->version = 0;
- err = ipmr_cache_unresolved(vif, skb);
+ skb2 = skb_clone(skb, GFP_ATOMIC);
+ if (!skb2) {
+ read_unlock(&mrt_lock);
+ return -ENOMEM;
+ }
+
+ skb2->nh.raw = skb_push(skb2, sizeof(struct iphdr));
+ skb2->nh.iph->ihl = sizeof(struct iphdr)>>2;
+ skb2->nh.iph->saddr = rt->rt_src;
+ skb2->nh.iph->daddr = rt->rt_dst;
+ skb2->nh.iph->version = 0;
+ err = ipmr_cache_unresolved(vif, skb2);
read_unlock(&mrt_lock);
return err;
}