summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2019-05-21 07:24:33 -0400
committerPablo Neira Ayuso <pablo@netfilter.org>2019-05-22 04:56:06 -0400
commit69aeb538587e087bfc81dd1f465eab3558ff3158 (patch)
treee36e67f944e8b68f5266e7f702f0b3fd312448c3 /net
parent91a9048f238063dde7feea752b9dd386f7e3808b (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.c17
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
51static bool nft_flow_offload_skip(struct sk_buff *skb) 51static 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);