]> git.ipfire.org Git - thirdparty/systemd.git/commit
oomd: Fix bug where we drop queued kill state on duplicate cgroup
authorChris Down <chris@chrisdown.name>
Sun, 15 Feb 2026 17:30:02 +0000 (01:30 +0800)
committerChris Down <chris@chrisdown.name>
Sun, 15 Feb 2026 17:39:04 +0000 (01:39 +0800)
commitf4f1956d429668199a4cda9da332ca32b6e460de
tree051aeb4190322dc252ffb691d68f0198264100b6
parent4e77671be723d31249e03b27ca9d83b6d17de693
oomd: Fix bug where we drop queued kill state on duplicate cgroup

oomd_cgroup_kill_mark() allocates a temporary OomdKillState and inserts
it into kill_states via set_ensure_put(). This is keyed by cgroup path.
When the same cgroup is already queued, set_ensure_put() dutifully
returns 0.

The function then returns with
_cleanup_(oomd_kill_state_removep) still armed, which eventually calls
oomd_kill_state_free().

oomd_kill_state_free() removes from kill_states by cgroup-path key, so
because this path already exists, it will remove the existing queued
kill state instead of just dropping the temporary object.

This is wrong and results in mistakenly drops the queued kill state on
duplicates.

This can happen when a cgroup is marked multiple times before the first
queued kill state is consumed. The result is lost kill-state tracking
and incorrect prekill/kill sequencing.

Handle r == 0 explicitly by freeing only the temporary object and
leaving the already queued state intact.
src/oom/oomd-util.c