Skip to content

Commit f855691

Browse files
committed
xfrm6: Fix the nexthdr offset in _decode_session6.
xfrm_decode_session() was originally designed for the usage in the receive path where the correct nexthdr offset is stored in IP6CB(skb)->nhoff. Over time this function spread to code that is used in the output path (netfilter, vti) where IP6CB(skb)->nhoff is not set. As a result, we get a wrong nexthdr and the upper layer flow informations are wrong. This can leed to incorrect policy lookups. Signed-off-by: Steffen Klassert <[email protected]>
1 parent de3b7a0 commit f855691

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

net/ipv6/xfrm6_policy.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,14 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse)
134134
u16 offset = sizeof(*hdr);
135135
struct ipv6_opt_hdr *exthdr;
136136
const unsigned char *nh = skb_network_header(skb);
137-
u8 nexthdr = nh[IP6CB(skb)->nhoff];
137+
u16 nhoff = IP6CB(skb)->nhoff;
138138
int oif = 0;
139+
u8 nexthdr;
140+
141+
if (!nhoff)
142+
nhoff = offsetof(struct ipv6hdr, nexthdr);
143+
144+
nexthdr = nh[nhoff];
139145

140146
if (skb_dst(skb))
141147
oif = skb_dst(skb)->dev->ifindex;

0 commit comments

Comments
 (0)