authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-03-20 11:13:50-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-03-20 17:14:52-07:00
log4bc18c52f7970774654b104640466618f4382655
treeea7dc8c6c955b934e2f1dfb3be2ac40a4bec227c
parent19b69959395b0ebb209815c5dbf29a5b21447df9

std.hash_map: fix pointer lock safety false positive

closes #19358

1 files changed, 8 insertions(+), 2 deletions(-)

lib/std/hash_map.zig+8-2
......@@ -1559,9 +1559,9 @@ pub fn HashMapUnmanaged(
15591559 assert(std.math.isPowerOfTwo(new_cap));
15601560
15611561 var map: Self = .{};
1562 defer map.deinit(allocator);
1563 map.pointer_stability.lock();
15641562 try map.allocate(allocator, new_cap);
1563 errdefer comptime unreachable;
1564 map.pointer_stability.lock();
15651565 map.initMetadatas();
15661566 map.available = @truncate((new_cap * max_load_percentage) / 100);
15671567
......@@ -1581,6 +1581,7 @@ pub fn HashMapUnmanaged(
15811581 self.size = 0;
15821582 self.pointer_stability = .{ .state = .unlocked };
15831583 std.mem.swap(Self, self, &map);
1584 map.deinit(allocator);
15841585 }
15851586
15861587 fn allocate(self: *Self, allocator: Allocator, new_capacity: Size) Allocator.Error!void {
......@@ -2266,3 +2267,8 @@ test "repeat fetchRemove" {
22662267 try testing.expect(map.get(2) != null);
22672268 try testing.expect(map.get(3) != null);
22682269}
2270
2271test "getOrPut allocation failure" {
2272 var map: std.StringHashMapUnmanaged(void) = .{};
2273 try testing.expectError(error.OutOfMemory, map.getOrPut(std.testing.failing_allocator, "hello"));
2274}