aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMotiejus Jakštys <motiejus@jakstys.lt>2022-03-01 14:55:15 +0200
committerAndrew Kelley <andrew@ziglang.org>2022-03-01 13:28:47 -0500
commit543bee0adf2d3b036654fa0983c16ff7023f504c (patch)
treef5aaeb93432acd7f8bff670dc3229c99ff7dbb71
parent52205a3c162d5adaf98be1dbf96bf86afd658182 (diff)
downloadzig-543bee0adf2d3b036654fa0983c16ff7023f504c.tar.gz
zig-543bee0adf2d3b036654fa0983c16ff7023f504c.zip
std.BufSet.clone: fix key ownership
This was introduced in d1a46548349a902c30057b3ba66ebad9bc25bdd2: when a BufSet clones the keys, it used to assign the new pointers to the old struct. Fix that by assigning the pointers to the correct, i.e. the new, struct. This caused double-free when using arena allocator for the new struct, also in the test case.
-rw-r--r--lib/std/buf_set.zig15
1 files changed, 14 insertions, 1 deletions
diff --git a/lib/std/buf_set.zig b/lib/std/buf_set.zig
index fc858f220c..9d6d7ed1e6 100644
--- a/lib/std/buf_set.zig
+++ b/lib/std/buf_set.zig
@@ -78,7 +78,7 @@ pub const BufSet = struct {
) Allocator.Error!BufSet {
var cloned_hashmap = try self.hash_map.cloneWithAllocator(new_allocator);
var cloned = BufSet{ .hash_map = cloned_hashmap };
- var it = self.hash_map.keyIterator();
+ var it = cloned.hash_map.keyIterator();
while (it.next()) |key_ptr| {
key_ptr.* = try cloned.copy(key_ptr.*);
}
@@ -132,3 +132,16 @@ test "BufSet clone" {
original.cloneWithAllocator(testing.failing_allocator),
);
}
+
+test "BufSet.clone with arena" {
+ var allocator = std.testing.allocator;
+ var arena = std.heap.ArenaAllocator.init(allocator);
+ defer arena.deinit();
+
+ var buf = BufSet.init(allocator);
+ defer buf.deinit();
+ try buf.insert("member1");
+ try buf.insert("member2");
+
+ _ = try buf.cloneWithAllocator(arena.allocator());
+}