Skip to content

Commit

Permalink
Merge pull request ziglang#20000 from Frojdholm/fix-gpa-crash-when-de…
Browse files Browse the repository at this point in the history
…allocating-metadata

Fix GeneralPurposeAllocator crash when deallocating metadata
  • Loading branch information
andrewrk committed Jun 6, 2024
2 parents aef66ee + d526a2c commit 3964b2a
Showing 1 changed file with 21 additions and 2 deletions.
23 changes: 21 additions & 2 deletions lib/std/heap/general_purpose_allocator.zig
Original file line number Diff line number Diff line change
Expand Up @@ -445,8 +445,11 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
}
}
// free retained metadata for small allocations
var empty_it = self.empty_buckets.inorderIterator();
while (empty_it.next()) |node| {
while (self.empty_buckets.getMin()) |node| {
// remove the node from the tree before destroying it
var entry = self.empty_buckets.getEntryForExisting(node);
entry.set(null);

var bucket = node.key;
if (config.never_unmap) {
// free page that was intentionally leaked by never_unmap
Expand Down Expand Up @@ -1455,3 +1458,19 @@ test "bug 9995 fix, large allocs count requested size not backing size" {
buf = try allocator.realloc(buf, 2);
try std.testing.expect(gpa.total_requested_bytes == 2);
}

test "retain metadata and never unmap" {
var gpa = std.heap.GeneralPurposeAllocator(.{
.safety = true,
.never_unmap = true,
.retain_metadata = true,
}){};
defer std.debug.assert(gpa.deinit() == .ok);
const allocator = gpa.allocator();

const alloc = try allocator.alloc(u8, 8);
allocator.free(alloc);

const alloc2 = try allocator.alloc(u8, 8);
allocator.free(alloc2);
}

0 comments on commit 3964b2a

Please sign in to comment.