diff options
author | Florian Westphal <fw@strlen.de> | 2019-05-21 07:24:33 -0400 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2019-05-22 04:56:06 -0400 |
commit | 69aeb538587e087bfc81dd1f465eab3558ff3158 (patch) | |
tree | e36e67f944e8b68f5266e7f702f0b3fd312448c3 /net | |
parent | 91a9048f238063dde7feea752b9dd386f7e3808b (diff) |
netfilter: nft_flow_offload: IPCB is only valid for ipv4 family
Guard this with a check vs. ipv4, IPCB isn't valid in ipv6 case.
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'net')
-rw-r--r-- | net/netfilter/nft_flow_offload.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/net/netfilter/nft_flow_offload.c b/net/netfilter/nft_flow_offload.c index c97c03c3939a..d70742e95e14 100644 --- a/net/netfilter/nft_flow_offload.c +++ b/net/netfilter/nft_flow_offload.c | |||
@@ -48,15 +48,20 @@ static int nft_flow_route(const struct nft_pktinfo *pkt, | |||
48 | return 0; | 48 | return 0; |
49 | } | 49 | } |
50 | 50 | ||
51 | static bool nft_flow_offload_skip(struct sk_buff *skb) | 51 | static bool nft_flow_offload_skip(struct sk_buff *skb, int family) |
52 | { | 52 | { |
53 | struct ip_options *opt = &(IPCB(skb)->opt); | ||
54 | |||
55 | if (unlikely(opt->optlen)) | ||
56 | return true; | ||
57 | if (skb_sec_path(skb)) | 53 | if (skb_sec_path(skb)) |
58 | return true; | 54 | return true; |
59 | 55 | ||
56 | if (family == NFPROTO_IPV4) { | ||
57 | const struct ip_options *opt; | ||
58 | |||
59 | opt = &(IPCB(skb)->opt); | ||
60 | |||
61 | if (unlikely(opt->optlen)) | ||
62 | return true; | ||
63 | } | ||
64 | |||
60 | return false; | 65 | return false; |
61 | } | 66 | } |
62 | 67 | ||
@@ -74,7 +79,7 @@ static void nft_flow_offload_eval(const struct nft_expr *expr, | |||
74 | struct nf_conn *ct; | 79 | struct nf_conn *ct; |
75 | int ret; | 80 | int ret; |
76 | 81 | ||
77 | if (nft_flow_offload_skip(pkt->skb)) | 82 | if (nft_flow_offload_skip(pkt->skb, nft_pf(pkt))) |
78 | goto out; | 83 | goto out; |
79 | 84 | ||
80 | ct = nf_ct_get(pkt->skb, &ctinfo); | 85 | ct = nf_ct_get(pkt->skb, &ctinfo); |