Skip to content

Commit 5fc0e7e

Browse files
committed
netfilter: nf_set_pipapo_avx2: fix initial map fill
jira VULN-71797 cve CVE-2025-38120 commit-author Florian Westphal <[email protected]> commit ea77c39 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]> (cherry picked from commit ea77c39) Signed-off-by: Marcin Wcisło <[email protected]>
1 parent ee51577 commit 5fc0e7e

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
@@ -1117,6 +1117,25 @@ bool nft_pipapo_avx2_estimate(const struct nft_set_desc *desc, u32 features,
11171117
return true;
11181118
}
11191119

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

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

11711190
nft_pipapo_avx2_prepare();
11721191

0 commit comments

Comments
 (0)