Commit ea77c397 authored by Florian Westphal's avatar Florian Westphal Committed by Pablo Neira Ayuso
Browse files

netfilter: nf_set_pipapo_avx2: fix initial map fill



If the first field doesn't cover the entire start map, then we must zero
out the remainder, else we leak those bits into the next match round map.

The early fix was incomplete and did only fix up the generic C
implementation.

A followup patch adds a test case to nft_concat_range.sh.

Fixes: 791a615b ("netfilter: nf_set_pipapo: fix initial map fill")
Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
Reviewed-by: default avatarStefano Brivio <sbrivio@redhat.com>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 12c331b2
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
@@ -1113,6 +1113,25 @@ bool nft_pipapo_avx2_estimate(const struct nft_set_desc *desc, u32 features,
	return true;
}

/**
 * pipapo_resmap_init_avx2() - Initialise result map before first use
 * @m:		Matching data, including mapping table
 * @res_map:	Result map
 *
 * Like pipapo_resmap_init() but do not set start map bits covered by the first field.
 */
static inline void pipapo_resmap_init_avx2(const struct nft_pipapo_match *m, unsigned long *res_map)
{
	const struct nft_pipapo_field *f = m->f;
	int i;

	/* Starting map doesn't need to be set to all-ones for this implementation,
	 * but we do need to zero the remaining bits, if any.
	 */
	for (i = f->bsize; i < m->bsize_max; i++)
		res_map[i] = 0ul;
}

/**
 * nft_pipapo_avx2_lookup() - Lookup function for AVX2 implementation
 * @net:	Network namespace
@@ -1171,7 +1190,7 @@ bool nft_pipapo_avx2_lookup(const struct net *net, const struct nft_set *set,
	res  = scratch->map + (map_index ? m->bsize_max : 0);
	fill = scratch->map + (map_index ? 0 : m->bsize_max);

	/* Starting map doesn't need to be set for this implementation */
	pipapo_resmap_init_avx2(m, res);

	nft_pipapo_avx2_prepare();