Thread (26 messages) flat view 26 messages, 5 authors, 4d ago

Re: [PATCH net 10/10] netfilter: nf_tables: skip expired catchall elements on insert and delete

From: Pablo Neira Ayuso <pablo@netfilter.org>
Date: 2026-09-18 08:41:44
Also in: netfilter-devel

On Thu, Sep 17, 2026 at 07:04:12PM -0700, Jakub Kicinski wrote:
This is an AI-generated review of your patch. The human sending this
email has considered the AI review valid, or at least plausible.
---
netfilter: nf_tables: skip expired catchall elements on insert and delete

This adds an expiry test to the catchall duplicate walk in
nft_setelem_catchall_insert() and to the delete-candidate walk in
nft_setelem_catchall_deactivate(), using the per-netns transaction
timestamp.  The stated goal is to make both control-plane walks agree with
the lookup and dump predicates.

A couple of questions on the new predicates and on the commit message.
quoted
The delete path shows the same drift: nft_setelem_catchall_deactivate()
picks the first active-next entry in the catchall list, so with an
expired entry still pending GC it retires the stale entry instead of
the fresh one, and it deactivates an element that userspace no longer
sees instead of failing with -ENOENT.
[Severity: Low]
Is the first half of this paragraph reachable before this patch?  The
"expired entry still pending GC ... instead of the fresh one" wording
implies a stale active-next entry and a fresh active-next entry can coexist
in catchall_list.

Pre-patch nft_setelem_catchall_insert() rejected every entry that was
active in the next generation, expired or not:

	list_for_each_entry(catchall, &set->catchall_list, list) {
		ext = nft_set_elem_ext(set, catchall->elem);
		if (nft_set_elem_active(ext, genmask)) {
			*priv = catchall->elem;
			return -EEXIST;
		}
	}

The other ways an entry leaves active-next all unlink it from
catchall_list (nft_trans_gc_catchall_sync(), the async GC completion) or
happen on an explicit delete, and the non-EXCL add refreshed the existing
element through nft_trans_elem_update() rather than linking a second one.
So the "wrong entry retired" state seems to first become reachable because
of the insert hunk in this same patch.

The second half (deactivating an element userspace no longer sees instead of
returning -ENOENT) does look pre-existing.

Since the two hunks are interdependent, could the message say so explicitly
so the stable backport is not split?
No need to split this stable backport...
[Severity: High]
Should this predicate also test nft_set_elem_is_dead()?
Yes, originally this patch checked for the dead and it is indeed need.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help