summaryrefslogtreecommitdiffstats
path: root/target/linux/generic/patches-3.14/080-backport_xfrm_crash_fix.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/patches-3.14/080-backport_xfrm_crash_fix.patch')
-rw-r--r--target/linux/generic/patches-3.14/080-backport_xfrm_crash_fix.patch133
1 files changed, 0 insertions, 133 deletions
diff --git a/target/linux/generic/patches-3.14/080-backport_xfrm_crash_fix.patch b/target/linux/generic/patches-3.14/080-backport_xfrm_crash_fix.patch
deleted file mode 100644
index 754f518999..0000000000
--- a/target/linux/generic/patches-3.14/080-backport_xfrm_crash_fix.patch
+++ /dev/null
@@ -1,133 +0,0 @@
-commit 5596732fa8c14139018ecda8356eabbfb599d830
-Author: Steffen Klassert <steffen.klassert@secunet.com>
-Date: Mon Apr 7 08:08:52 2014 +0200
-
- xfrm: Fix crash with ipv6 IPsec tunnel and NAT.
-
- The ipv6 xfrm output path is not aware that packets can be
- rerouted by NAT to not use IPsec. We crash in this case
- because we expect to have a xfrm state at the dst_entry.
- This crash happens if the ipv6 layer does IPsec and NAT
- or if we have an interfamily IPsec tunnel with ipv4 NAT.
-
- We fix this by checking for a NAT rerouted packet in each
- address family and dst_output() to the new destination
- in this case.
-
- Reported-by: Martin Pelikan <martin.pelikan@gmail.com>
- Tested-by: Martin Pelikan <martin.pelikan@gmail.com>
- Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
-
---- a/net/ipv4/xfrm4_output.c
-+++ b/net/ipv4/xfrm4_output.c
-@@ -62,10 +62,7 @@ int xfrm4_prepare_output(struct xfrm_sta
- if (err)
- return err;
-
-- memset(IPCB(skb), 0, sizeof(*IPCB(skb)));
-- IPCB(skb)->flags |= IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED;
--
-- skb->protocol = htons(ETH_P_IP);
-+ IPCB(skb)->flags |= IPSKB_XFRM_TUNNEL_SIZE;
-
- return x->outer_mode->output2(x, skb);
- }
-@@ -73,27 +70,34 @@ EXPORT_SYMBOL(xfrm4_prepare_output);
-
- int xfrm4_output_finish(struct sk_buff *skb)
- {
-+ memset(IPCB(skb), 0, sizeof(*IPCB(skb)));
-+ skb->protocol = htons(ETH_P_IP);
-+
-+#ifdef CONFIG_NETFILTER
-+ IPCB(skb)->flags |= IPSKB_XFRM_TRANSFORMED;
-+#endif
-+
-+ return xfrm_output(skb);
-+}
-+
-+static int __xfrm4_output(struct sk_buff *skb)
-+{
-+ struct xfrm_state *x = skb_dst(skb)->xfrm;
-+
- #ifdef CONFIG_NETFILTER
-- if (!skb_dst(skb)->xfrm) {
-+ if (!x) {
- IPCB(skb)->flags |= IPSKB_REROUTED;
- return dst_output(skb);
- }
--
-- IPCB(skb)->flags |= IPSKB_XFRM_TRANSFORMED;
- #endif
-
-- skb->protocol = htons(ETH_P_IP);
-- return xfrm_output(skb);
-+ return x->outer_mode->afinfo->output_finish(skb);
- }
-
- int xfrm4_output(struct sk_buff *skb)
- {
-- struct dst_entry *dst = skb_dst(skb);
-- struct xfrm_state *x = dst->xfrm;
--
- return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING, skb,
-- NULL, dst->dev,
-- x->outer_mode->afinfo->output_finish,
-+ NULL, skb_dst(skb)->dev, __xfrm4_output,
- !(IPCB(skb)->flags & IPSKB_REROUTED));
- }
-
---- a/net/ipv6/xfrm6_output.c
-+++ b/net/ipv6/xfrm6_output.c
-@@ -114,12 +114,6 @@ int xfrm6_prepare_output(struct xfrm_sta
- if (err)
- return err;
-
-- memset(IP6CB(skb), 0, sizeof(*IP6CB(skb)));
--#ifdef CONFIG_NETFILTER
-- IP6CB(skb)->flags |= IP6SKB_XFRM_TRANSFORMED;
--#endif
--
-- skb->protocol = htons(ETH_P_IPV6);
- skb->local_df = 1;
-
- return x->outer_mode->output2(x, skb);
-@@ -128,11 +122,13 @@ EXPORT_SYMBOL(xfrm6_prepare_output);
-
- int xfrm6_output_finish(struct sk_buff *skb)
- {
-+ memset(IP6CB(skb), 0, sizeof(*IP6CB(skb)));
-+ skb->protocol = htons(ETH_P_IPV6);
-+
- #ifdef CONFIG_NETFILTER
- IP6CB(skb)->flags |= IP6SKB_XFRM_TRANSFORMED;
- #endif
-
-- skb->protocol = htons(ETH_P_IPV6);
- return xfrm_output(skb);
- }
-
-@@ -142,6 +138,13 @@ static int __xfrm6_output(struct sk_buff
- struct xfrm_state *x = dst->xfrm;
- int mtu;
-
-+#ifdef CONFIG_NETFILTER
-+ if (!x) {
-+ IP6CB(skb)->flags |= IP6SKB_REROUTED;
-+ return dst_output(skb);
-+ }
-+#endif
-+
- if (skb->protocol == htons(ETH_P_IPV6))
- mtu = ip6_skb_dst_mtu(skb);
- else
-@@ -165,6 +168,7 @@ static int __xfrm6_output(struct sk_buff
-
- int xfrm6_output(struct sk_buff *skb)
- {
-- return NF_HOOK(NFPROTO_IPV6, NF_INET_POST_ROUTING, skb, NULL,
-- skb_dst(skb)->dev, __xfrm6_output);
-+ return NF_HOOK_COND(NFPROTO_IPV6, NF_INET_POST_ROUTING, skb,
-+ NULL, skb_dst(skb)->dev, __xfrm6_output,
-+ !(IP6CB(skb)->flags & IP6SKB_REROUTED));
- }