Skip to content

Commit

Permalink
xfrm: policy: fix layer 4 flowi decoding
Browse files Browse the repository at this point in the history
The commit shipped with two bugs:
 fl4->fl4_icmp_type = flkeys->icmp.type;
 fl4->fl4_icmp_type = flkeys->icmp.code;
               ~~~~ should have been "code".

But the more severe bug is that I got fooled by flowi member defines:
fl4_icmp_type, fl4_gre_key and fl4_dport share the same union/address.

Fix typo and make gre/icmp key setting depend on the l4 protocol.

Fixes: 7a02070 ("xfrm: policy: replace session decode with flow dissector")
Reported-and-tested-by: Antony Antony <[email protected]>
Signed-off-by: Florian Westphal <[email protected]>
Signed-off-by: Steffen Klassert <[email protected]>
  • Loading branch information
Florian Westphal authored and klassert committed Oct 27, 2023
1 parent 53a5b4f commit eefed76
Showing 1 changed file with 20 additions and 6 deletions.
26 changes: 20 additions & 6 deletions net/xfrm/xfrm_policy.c
Original file line number Diff line number Diff line change
Expand Up @@ -3400,11 +3400,18 @@ decode_session4(const struct xfrm_flow_keys *flkeys, struct flowi *fl, bool reve
fl4->fl4_dport = flkeys->ports.dst;
}

switch (flkeys->basic.ip_proto) {
case IPPROTO_GRE:
fl4->fl4_gre_key = flkeys->gre.keyid;
break;
case IPPROTO_ICMP:
fl4->fl4_icmp_type = flkeys->icmp.type;
fl4->fl4_icmp_code = flkeys->icmp.code;
break;
}

fl4->flowi4_proto = flkeys->basic.ip_proto;
fl4->flowi4_tos = flkeys->ip.tos;
fl4->fl4_icmp_type = flkeys->icmp.type;
fl4->fl4_icmp_type = flkeys->icmp.code;
fl4->fl4_gre_key = flkeys->gre.keyid;
}

#if IS_ENABLED(CONFIG_IPV6)
Expand All @@ -3427,10 +3434,17 @@ decode_session6(const struct xfrm_flow_keys *flkeys, struct flowi *fl, bool reve
fl6->fl6_dport = flkeys->ports.dst;
}

switch (flkeys->basic.ip_proto) {
case IPPROTO_GRE:
fl6->fl6_gre_key = flkeys->gre.keyid;
break;
case IPPROTO_ICMPV6:
fl6->fl6_icmp_type = flkeys->icmp.type;
fl6->fl6_icmp_code = flkeys->icmp.code;
break;
}

fl6->flowi6_proto = flkeys->basic.ip_proto;
fl6->fl6_icmp_type = flkeys->icmp.type;
fl6->fl6_icmp_type = flkeys->icmp.code;
fl6->fl6_gre_key = flkeys->gre.keyid;
}
#endif

Expand Down

0 comments on commit eefed76

Please sign in to comment.