]> git.ipfire.org Git - thirdparty/systemd.git/commit
nsresourced: detect and clean up registry entries for dead user namespaces 42070/head
authorDaan De Meyer <daan@amutable.com>
Wed, 13 May 2026 10:54:02 +0000 (12:54 +0200)
committerDaan De Meyer <daan@amutable.com>
Fri, 15 May 2026 18:05:21 +0000 (18:05 +0000)
commit23f22047189a291b9ba19185a24264771ab8c467
tree99215e09faa1e634ccd5f46249e120a8caccf2cd
parentba1d406f9ba4440a9b54ead261ba8fef0b5b353f
nsresourced: detect and clean up registry entries for dead user namespaces

The BPF kprobe that fires on user namespace destruction is the only thing
that triggers registry cleanup, so any time it doesn't run — ring buffer
overflow, kprobe missing, fdstore entry dropped outside our cleanup path
— a registry entry is left behind forever.

Stamp each registry entry with the kernel's unique namespace identifier
(NS_GET_ID, kernel ≥ 6.13) at allocation time. At manager startup, after
the existing fdstore→registry sweep, walk the registry and ask the kernel
to look each namespace up by id via open_by_handle_at() on nsfs; if the
lookup returns -ESTALE the namespace is gone and we release the entry.
Old entries written before this change carry no identifier and are left
alone.

Add a namespace_open_by_id() helper for the lookup. The kernel restricts
open_by_handle_at() on nsfs to processes in the initial user namespace,
collapsing both permission denials and dead namespaces onto -ESTALE; the
helper refuses early with -EHOSTDOWN outside the initial user namespace
so callers can tell the two apart.
src/basic/namespace-util.c
src/basic/namespace-util.h
src/include/override/fcntl.h
src/include/override/linux/nsfs.h
src/nsresourced/nsresourced-manager.c
src/nsresourced/nsresourcework.c
src/nsresourced/userns-registry.c
src/nsresourced/userns-registry.h
src/test/test-namespace.c