Skip to content

Commit 45724b2

Browse files
committed
netfilter: nft_set_rbtree: skip end interval element from gc
jira VULN-8184 cve CVE-2024-26581 commit-author Pablo Neira Ayuso <pablo@netfilter.org> commit 60c0c23 rbtree lazy gc on insert might collect an end interval element that has been just added in this transactions, skip end interval elements that are not yet active. Fixes: f718863 ("netfilter: nft_set_rbtree: fix overlap expiration walk") Cc: stable@vger.kernel.org Reported-by: lonial con <kongln9170@gmail.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> (cherry picked from commit 60c0c23) Signed-off-by: Marcin Wcisło <marcin.wcislo@conclusive.pl>
1 parent b301e6d commit 45724b2

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

net/netfilter/nft_set_rbtree.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ static void nft_rbtree_gc_remove(struct net *net, struct nft_set *set,
238238

239239
static const struct nft_rbtree_elem *
240240
nft_rbtree_gc_elem(const struct nft_set *__set, struct nft_rbtree *priv,
241-
struct nft_rbtree_elem *rbe, u8 genmask)
241+
struct nft_rbtree_elem *rbe)
242242
{
243243
struct nft_set *set = (struct nft_set *)__set;
244244
struct rb_node *prev = rb_prev(&rbe->node);
@@ -257,7 +257,7 @@ nft_rbtree_gc_elem(const struct nft_set *__set, struct nft_rbtree *priv,
257257
while (prev) {
258258
rbe_prev = rb_entry(prev, struct nft_rbtree_elem, node);
259259
if (nft_rbtree_interval_end(rbe_prev) &&
260-
nft_set_elem_active(&rbe_prev->ext, genmask))
260+
nft_set_elem_active(&rbe_prev->ext, NFT_GENMASK_ANY))
261261
break;
262262

263263
prev = rb_prev(prev);
@@ -368,7 +368,7 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set,
368368
nft_set_elem_active(&rbe->ext, cur_genmask)) {
369369
const struct nft_rbtree_elem *removed_end;
370370

371-
removed_end = nft_rbtree_gc_elem(set, priv, rbe, genmask);
371+
removed_end = nft_rbtree_gc_elem(set, priv, rbe);
372372
if (IS_ERR(removed_end))
373373
return PTR_ERR(removed_end);
374374

0 commit comments

Comments
 (0)