From 95d31a7697dbf451adc93132eb9c3180b9042535 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Wed, 18 Sep 2024 21:29:41 +0200 Subject: [PATCH] feat: use a dynamic buffer to prohibit error.Overflow in jsonScanUntil Also, clean-up the definition of CborJsonError --- src/cbor.zig | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/cbor.zig b/src/cbor.zig index e0a5793..3a958cf 100644 --- a/src/cbor.zig +++ b/src/cbor.zig @@ -18,19 +18,13 @@ pub const CborError = error{ OutOfMemory, }; -pub const CborJsonError = error{ +pub const CborJsonError = (CborError || error{ BufferUnderrun, - CborIntegerTooLarge, - CborIntegerTooSmall, - CborInvalidType, - CborTooShort, CborUnsupportedType, NoSpaceLeft, - OutOfMemory, - Overflow, SyntaxError, UnexpectedEndOfInput, -}; +}); const cbor_magic_null: u8 = 0xf6; const cbor_magic_true: u8 = 0xf5; @@ -1003,7 +997,9 @@ fn writeJsonValue(writer: anytype, value: json.Value) !void { } fn jsonScanUntil(writer: anytype, scanner: *json.Scanner, end_token: anytype) CborJsonError!usize { - var partial = try std.BoundedArray(u8, 4096).init(0); + var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer arena.deinit(); + var partial = std.ArrayList(u8).init(arena.allocator()); var count: usize = 0; var token = try scanner.next(); @@ -1019,7 +1015,7 @@ fn jsonScanUntil(writer: anytype, scanner: *json.Scanner, end_token: anytype) Cb .number => |v| { try partial.appendSlice(v); - try writeJsonValue(writer, json.Value.parseFromNumberSlice(partial.slice())); + try writeJsonValue(writer, json.Value.parseFromNumberSlice(partial.items)); try partial.resize(0); }, .partial_number => |v| { @@ -1029,7 +1025,7 @@ fn jsonScanUntil(writer: anytype, scanner: *json.Scanner, end_token: anytype) Cb .string => |v| { try partial.appendSlice(v); - try writeString(writer, partial.slice()); + try writeString(writer, partial.items); try partial.resize(0); }, .partial_string => |v| {