Skip to content

Commit ea77c39

Browse files
Florian Westphalummakynes
authored andcommitted
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: 791a615 ("netfilter: nf_set_pipapo: fix initial map fill") Signed-off-by: Florian Westphal <[email protected]> Reviewed-by: Stefano Brivio <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]>
1 parent 12c331b commit ea77c39

File tree

1 file changed

+20
-1
lines changed

1 file changed

+20
-1
lines changed

net/netfilter/nft_set_pipapo_avx2.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1113,6 +1113,25 @@ bool nft_pipapo_avx2_estimate(const struct nft_set_desc *desc, u32 features,
11131113
return true;
11141114
}
11151115

1116+
/**
1117+
* pipapo_resmap_init_avx2() - Initialise result map before first use
1118+
* @m: Matching data, including mapping table
1119+
* @res_map: Result map
1120+
*
1121+
* Like pipapo_resmap_init() but do not set start map bits covered by the first field.
1122+
*/
1123+
static inline void pipapo_resmap_init_avx2(const struct nft_pipapo_match *m, unsigned long *res_map)
1124+
{
1125+
const struct nft_pipapo_field *f = m->f;
1126+
int i;
1127+
1128+
/* Starting map doesn't need to be set to all-ones for this implementation,
1129+
* but we do need to zero the remaining bits, if any.
1130+
*/
1131+
for (i = f->bsize; i < m->bsize_max; i++)
1132+
res_map[i] = 0ul;
1133+
}
1134+
11161135
/**
11171136
* nft_pipapo_avx2_lookup() - Lookup function for AVX2 implementation
11181137
* @net: Network namespace
@@ -1171,7 +1190,7 @@ bool nft_pipapo_avx2_lookup(const struct net *net, const struct nft_set *set,
11711190
res = scratch->map + (map_index ? m->bsize_max : 0);
11721191
fill = scratch->map + (map_index ? 0 : m->bsize_max);
11731192

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

11761195
nft_pipapo_avx2_prepare();
11771196

0 commit comments

Comments
 (0)