diff options
| author | John Schmidt <john.schmidt.h@gmail.com> | 2023-02-04 18:44:57 +0100 |
|---|---|---|
| committer | John Schmidt <john.schmidt.h@gmail.com> | 2023-02-04 20:34:47 +0100 |
| commit | b42caff2a20eb34073f6a766f55d27288028165a (patch) | |
| tree | 7546598aadbf85261ed91a92cd44b076432952bd /lib/std/json.zig | |
| parent | 73c857415eafc1d0856b6917cada94d8acde41e0 (diff) | |
| download | zig-b42caff2a20eb34073f6a766f55d27288028165a.tar.gz zig-b42caff2a20eb34073f6a766f55d27288028165a.zip | |
std.json: avoid dangling pointers in ValueTree
Closes https://github.com/ziglang/zig/issues/5229.
Diffstat (limited to 'lib/std/json.zig')
| -rw-r--r-- | lib/std/json.zig | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/std/json.zig b/lib/std/json.zig index 41bfb30bc5..1c4cbdf5cb 100644 --- a/lib/std/json.zig +++ b/lib/std/json.zig @@ -1163,11 +1163,12 @@ const ArrayList = std.ArrayList; const StringArrayHashMap = std.StringArrayHashMap; pub const ValueTree = struct { - arena: ArenaAllocator, + arena: *ArenaAllocator, root: Value, pub fn deinit(self: *ValueTree) void { self.arena.deinit(); + self.arena.child_allocator.destroy(self.arena); } }; @@ -1809,8 +1810,12 @@ pub const Parser = struct { pub fn parse(p: *Parser, input: []const u8) !ValueTree { var s = TokenStream.init(input); - var arena = ArenaAllocator.init(p.allocator); + var arena = try p.allocator.create(ArenaAllocator); + errdefer p.allocator.destroy(arena); + + arena.* = ArenaAllocator.init(p.allocator); errdefer arena.deinit(); + const allocator = arena.allocator(); while (try s.next()) |token| { |
