zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 762e2a4b52084beb41fb4a0d34d55f5a907db00a (tree)
parent 61f1b2db704c9bfa96c6a965fdba57cf3692b2c9
Author: Hampus Fröjdholm <hampus.frojdholm@gmail.com>
Date:   Sat, 18 May 2024 11:46:37 +0200

gpa: Fix GeneralPurposeAllocator double free stack traces

The wrong `size_class` was used when fetching stack traces from empty
buckets. The `size_class` would always be the maximum value after
exhausting the search of active buckets rather than the actual
`size_class` of the allocation.

Diffstat:
Mlib/std/heap/general_purpose_allocator.zig | 2++
1 file changed, 2 insertions(+), 0 deletions(-)

diff --git a/lib/std/heap/general_purpose_allocator.zig b/lib/std/heap/general_purpose_allocator.zig @@ -732,6 +732,7 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type { if (!self.large_allocations.contains(@intFromPtr(old_mem.ptr))) { // object not in active buckets or a large allocation, so search empty buckets if (searchBucket(&self.empty_buckets, @intFromPtr(old_mem.ptr), null)) |bucket| { + size_class = bucket.emptyBucketSizeClass(); // bucket is empty so is_used below will always be false and we exit there break :blk bucket; } else { @@ -850,6 +851,7 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type { if (!self.large_allocations.contains(@intFromPtr(old_mem.ptr))) { // object not in active buckets or a large allocation, so search empty buckets if (searchBucket(&self.empty_buckets, @intFromPtr(old_mem.ptr), null)) |bucket| { + size_class = bucket.emptyBucketSizeClass(); // bucket is empty so is_used below will always be false and we exit there break :blk bucket; } else {