]> git.baikalelectronics.ru Git - kernel.git/commitdiff
netfilter: nft_set_pipapo: allocate pcpu scratch maps on clone
authorFlorian Westphal <fw@strlen.de>
Wed, 5 Jan 2022 13:19:54 +0000 (14:19 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 6 Jan 2022 09:43:24 +0000 (10:43 +0100)
This is needed in case a new transaction is made that doesn't insert any
new elements into an already existing set.

Else, after second 'nft -f ruleset.txt', lookups in such a set will fail
because ->lookup() encounters raw_cpu_ptr(m->scratch) == NULL.

For the initial rule load, insertion of elements takes care of the
allocation, but for rule reloads this isn't guaranteed: we might not
have additions to the set.

Fixes: 14357d3fdd6c6032 ("nf_tables: Add set type for arbitrary concatenation of ranges")
Reported-by: etkaar <lists.netfilter.org@prvy.eu>
Signed-off-by: Florian Westphal <fw@strlen.de>
Reviewed-by: Stefano Brivio <sbrivio@redhat.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nft_set_pipapo.c

index dce866d93feed1bf60493d7ff89a4892096f6e30..2c8051d8cca69ce4e232cbe7e07538ab1262694f 100644 (file)
@@ -1290,6 +1290,11 @@ static struct nft_pipapo_match *pipapo_clone(struct nft_pipapo_match *old)
        if (!new->scratch_aligned)
                goto out_scratch;
 #endif
+       for_each_possible_cpu(i)
+               *per_cpu_ptr(new->scratch, i) = NULL;
+
+       if (pipapo_realloc_scratch(new, old->bsize_max))
+               goto out_scratch_realloc;
 
        rcu_head_init(&new->rcu);
 
@@ -1334,6 +1339,9 @@ out_lt:
                kvfree(dst->lt);
                dst--;
        }
+out_scratch_realloc:
+       for_each_possible_cpu(i)
+               kfree(*per_cpu_ptr(new->scratch, i));
 #ifdef NFT_PIPAPO_ALIGN
        free_percpu(new->scratch_aligned);
 #endif