diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2026-10-11 11:24:04 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2026-10-11 12:42:26 -0700 |
| commit | 345c38d6caa9c1dd5402f737d30ae9ed253b9025 (patch) | |
| tree | 0f3d3bbfd5919e3588bb546c138d0690a7a72820 /tools/perf/scripts/python/stackcollapse.py | |
| parent | 65a9b4df5a2c3e19bacb61c4b5e8ec99dc1fde43 (diff) | |
| download | linux-next-345c38d6caa9c1dd5402f737d30ae9ed253b9025.tar.gz linux-next-345c38d6caa9c1dd5402f737d30ae9ed253b9025.zip | |
assoc_array: keep gc's cleanup out of the live tree on allocation failure
assoc_array_gc() builds a copy of the tree. Where the copy reaches a
shortcut, it allocates the copy of the shortcut with kmalloc_flex(),
fills it with memcpy(), links it into the new tree, and only then
allocates the copy of the node after it. The memcpy() leaves the new
shortcut's next_node pointing at the old tree's node, so if that second
allocation fails, the cleanup, assoc_array_destroy_subtree() on the new
tree, follows the new shortcut into the old tree, and the BUG_ON() on
the old node's back pointer fires.
Allocate the node first, and the shortcut once the node exists, freeing
the node again if the shortcut cannot be allocated. A copied shortcut
is then only linked into the new tree when the copy of its node is there
to follow it. Nothing else changes: with no allocation failing, the
trees gc builds are the same as before.
Found by a userspace test that makes each allocation of each operation
fail in turn.
Fixes: 3cb989501c26 ("Add a generic associative array implementation.")
Assisted-by: LLM
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'tools/perf/scripts/python/stackcollapse.py')
0 files changed, 0 insertions, 0 deletions
