netfilter: xt_TCPOPTSTRIP: don't use tcp_hdr()
authorPablo Neira Ayuso <pablo@netfilter.org>
Mon, 10 Jun 2013 23:51:31 +0000 (01:51 +0200)
committerBen Hutchings <ben@decadent.org.uk>
Tue, 13 Feb 2018 18:32:21 +0000 (18:32 +0000)
commit ed82c437320c48a4032492f4a55a7e2c934158b6 upstream.

In (bc6bcb5 netfilter: xt_TCPOPTSTRIP: fix possible mangling beyond
packet boundary), the use of tcp_hdr was introduced. However, we
cannot assume that skb->transport_header is set for non-local packets.

Cc: Florian Westphal <fw@strlen.de>
Reported-by: Phil Oester <kernel@linuxace.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
net/netfilter/xt_TCPOPTSTRIP.c

index 052ccc2..817ffa7 100644 (file)
@@ -48,11 +48,13 @@ tcpoptstrip_mangle_packet(struct sk_buff *skb,
                return NF_DROP;
 
        len = skb->len - tcphoff;
                return NF_DROP;
 
        len = skb->len - tcphoff;
-       if (len < (int)sizeof(struct tcphdr) ||
-           tcp_hdr(skb)->doff * 4 > len)
+       if (len < (int)sizeof(struct tcphdr))
                return NF_DROP;
 
        tcph = (struct tcphdr *)(skb_network_header(skb) + tcphoff);
                return NF_DROP;
 
        tcph = (struct tcphdr *)(skb_network_header(skb) + tcphoff);
+       if (tcph->doff * 4 > len)
+               return NF_DROP;
+
        opt  = (u_int8_t *)tcph;
 
        /*
        opt  = (u_int8_t *)tcph;
 
        /*