netfilter: nft_set_pipapo: Actually validate intervals in fields after the first one
authorStefano Brivio <sbrivio@redhat.com>
Thu, 24 Nov 2022 12:04:37 +0000 (13:04 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 28 Nov 2022 12:17:11 +0000 (13:17 +0100)
Embarrassingly, nft_pipapo_insert() checked for interval validity in
the first field only.

The start_p and end_p pointers were reset to key data from the first
field at every iteration of the loop which was supposed to go over
the set fields.

Fixes: 3c4287f62044 ("nf_tables: Add set type for arbitrary concatenation of ranges")
Reported-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nft_set_pipapo.c

index 4f9299b..06d46d1 100644 (file)
@@ -1162,6 +1162,7 @@ static int nft_pipapo_insert(const struct net *net, const struct nft_set *set,
        struct nft_pipapo_match *m = priv->clone;
        u8 genmask = nft_genmask_next(net);
        struct nft_pipapo_field *f;
+       const u8 *start_p, *end_p;
        int i, bsize_max, err = 0;
 
        if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY_END))
@@ -1202,9 +1203,9 @@ static int nft_pipapo_insert(const struct net *net, const struct nft_set *set,
        }
 
        /* Validate */
+       start_p = start;
+       end_p = end;
        nft_pipapo_for_each_field(f, i, m) {
-               const u8 *start_p = start, *end_p = end;
-
                if (f->rules >= (unsigned long)NFT_PIPAPO_RULE0_MAX)
                        return -ENOSPC;