aboutsummaryrefslogtreecommitdiffstats
path: root/net/xfrm/xfrm_output.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/xfrm/xfrm_output.c')
-rw-r--r--net/xfrm/xfrm_output.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/net/xfrm/xfrm_output.c b/net/xfrm/xfrm_output.c
index b9fe13138c07..64f2ae1fdc15 100644
--- a/net/xfrm/xfrm_output.c
+++ b/net/xfrm/xfrm_output.c
@@ -14,6 +14,7 @@
14#include <linux/netdevice.h> 14#include <linux/netdevice.h>
15#include <linux/netfilter.h> 15#include <linux/netfilter.h>
16#include <linux/skbuff.h> 16#include <linux/skbuff.h>
17#include <linux/slab.h>
17#include <linux/spinlock.h> 18#include <linux/spinlock.h>
18#include <net/dst.h> 19#include <net/dst.h>
19#include <net/xfrm.h> 20#include <net/xfrm.h>
@@ -94,13 +95,13 @@ resume:
94 goto error_nolock; 95 goto error_nolock;
95 } 96 }
96 97
97 dst = dst_pop(dst); 98 dst = skb_dst_pop(skb);
98 if (!dst) { 99 if (!dst) {
99 XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTERROR); 100 XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTERROR);
100 err = -EHOSTUNREACH; 101 err = -EHOSTUNREACH;
101 goto error_nolock; 102 goto error_nolock;
102 } 103 }
103 skb_dst_set(skb, dst); 104 skb_dst_set(skb, dst_clone(dst));
104 x = dst->xfrm; 105 x = dst->xfrm;
105 } while (x && !(x->outer_mode->flags & XFRM_MODE_FLAG_TUNNEL)); 106 } while (x && !(x->outer_mode->flags & XFRM_MODE_FLAG_TUNNEL));
106 107