netfilter: nft_set_pipapo: allocate pcpu scratch maps on clone
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: 3c4287f620
("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>
This commit is contained in:
parent
4e1860a386
commit
23c54263ef
1 changed files with 8 additions and 0 deletions
|
@ -1290,6 +1290,11 @@ static struct nft_pipapo_match *pipapo_clone(struct nft_pipapo_match *old)
|
||||||
if (!new->scratch_aligned)
|
if (!new->scratch_aligned)
|
||||||
goto out_scratch;
|
goto out_scratch;
|
||||||
#endif
|
#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);
|
rcu_head_init(&new->rcu);
|
||||||
|
|
||||||
|
@ -1334,6 +1339,9 @@ out_lt:
|
||||||
kvfree(dst->lt);
|
kvfree(dst->lt);
|
||||||
dst--;
|
dst--;
|
||||||
}
|
}
|
||||||
|
out_scratch_realloc:
|
||||||
|
for_each_possible_cpu(i)
|
||||||
|
kfree(*per_cpu_ptr(new->scratch, i));
|
||||||
#ifdef NFT_PIPAPO_ALIGN
|
#ifdef NFT_PIPAPO_ALIGN
|
||||||
free_percpu(new->scratch_aligned);
|
free_percpu(new->scratch_aligned);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue