mirror of
https://github.com/ziglang/zig.git
synced 2026-02-16 14:28:57 +00:00
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.
This commit is contained in:
parent
61f1b2db70
commit
762e2a4b52
@ -732,6 +732,7 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
|
|||||||
if (!self.large_allocations.contains(@intFromPtr(old_mem.ptr))) {
|
if (!self.large_allocations.contains(@intFromPtr(old_mem.ptr))) {
|
||||||
// object not in active buckets or a large allocation, so search empty buckets
|
// object not in active buckets or a large allocation, so search empty buckets
|
||||||
if (searchBucket(&self.empty_buckets, @intFromPtr(old_mem.ptr), null)) |bucket| {
|
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
|
// bucket is empty so is_used below will always be false and we exit there
|
||||||
break :blk bucket;
|
break :blk bucket;
|
||||||
} else {
|
} else {
|
||||||
@ -850,6 +851,7 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
|
|||||||
if (!self.large_allocations.contains(@intFromPtr(old_mem.ptr))) {
|
if (!self.large_allocations.contains(@intFromPtr(old_mem.ptr))) {
|
||||||
// object not in active buckets or a large allocation, so search empty buckets
|
// object not in active buckets or a large allocation, so search empty buckets
|
||||||
if (searchBucket(&self.empty_buckets, @intFromPtr(old_mem.ptr), null)) |bucket| {
|
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
|
// bucket is empty so is_used below will always be false and we exit there
|
||||||
break :blk bucket;
|
break :blk bucket;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user