netfilter: conntrack: fix ipv6 exthdr error check
authorFlorian Westphal <fw@strlen.de>
Thu, 15 Dec 2022 14:16:33 +0000 (15:16 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 21 Dec 2022 16:34:00 +0000 (17:34 +0100)
smatch warnings:
net/netfilter/nf_conntrack_proto.c:167 nf_confirm() warn: unsigned 'protoff' is never less than zero.

We need to check if ipv6_skip_exthdr() returned an error, but protoff is
unsigned.  Use a signed integer for this.

Fixes: a70e483460d5 ("netfilter: conntrack: merge ipv4+ipv6 confirm functions")
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nf_conntrack_proto.c

index 99323fb..ccef340 100644 (file)
@@ -141,6 +141,7 @@ unsigned int nf_confirm(void *priv,
        struct nf_conn *ct;
        bool seqadj_needed;
        __be16 frag_off;
+       int start;
        u8 pnum;
 
        ct = nf_ct_get(skb, &ctinfo);
@@ -163,9 +164,11 @@ unsigned int nf_confirm(void *priv,
                break;
        case NFPROTO_IPV6:
                pnum = ipv6_hdr(skb)->nexthdr;
-               protoff = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr), &pnum, &frag_off);
-               if (protoff < 0 || (frag_off & htons(~0x7)) != 0)
+               start = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr), &pnum, &frag_off);
+               if (start < 0 || (frag_off & htons(~0x7)) != 0)
                        return nf_conntrack_confirm(skb);
+
+               protoff = start;
                break;
        default:
                return nf_conntrack_confirm(skb);