Commit ca064bd8 authored by Steffen Klassert's avatar Steffen Klassert

xfrm: Fix pmtu discovery for local generated packets.

Commit 044a832a ("xfrm: Fix local error reporting crash
with interfamily tunnels") moved the setting of skb->protocol
behind the last access of the inner mode family to fix an
interfamily crash. Unfortunately now skb->protocol might not
be set at all, so we fail dispatch to the inner address family.
As a reault, the local error handler is not called and the
mtu value is not reported back to userspace.

We fix this by setting skb->protocol on message size errors
before we call xfrm_local_error.

Fixes: 044a832a ("xfrm: Fix local error reporting crash with interfamily tunnels")
Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
parent 4e077237
...@@ -30,6 +30,8 @@ static int xfrm4_tunnel_check_size(struct sk_buff *skb) ...@@ -30,6 +30,8 @@ static int xfrm4_tunnel_check_size(struct sk_buff *skb)
mtu = dst_mtu(skb_dst(skb)); mtu = dst_mtu(skb_dst(skb));
if (skb->len > mtu) { if (skb->len > mtu) {
skb->protocol = htons(ETH_P_IP);
if (skb->sk) if (skb->sk)
xfrm_local_error(skb, mtu); xfrm_local_error(skb, mtu);
else else
......
...@@ -79,6 +79,7 @@ static int xfrm6_tunnel_check_size(struct sk_buff *skb) ...@@ -79,6 +79,7 @@ static int xfrm6_tunnel_check_size(struct sk_buff *skb)
if (!skb->ignore_df && skb->len > mtu) { if (!skb->ignore_df && skb->len > mtu) {
skb->dev = dst->dev; skb->dev = dst->dev;
skb->protocol = htons(ETH_P_IPV6);
if (xfrm6_local_dontfrag(skb)) if (xfrm6_local_dontfrag(skb))
xfrm6_local_rxpmtu(skb, mtu); xfrm6_local_rxpmtu(skb, mtu);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment