feat: use a dynamic buffer to prohibit error.Overflow in jsonScanUntil

Also, clean-up the definition of CborJsonError
This commit is contained in:
CJ van den Berg 2024-09-18 21:29:41 +02:00
parent ae54c014aa
commit 95d31a7697

View file

@ -18,19 +18,13 @@ pub const CborError = error{
OutOfMemory, OutOfMemory,
}; };
pub const CborJsonError = error{ pub const CborJsonError = (CborError || error{
BufferUnderrun, BufferUnderrun,
CborIntegerTooLarge,
CborIntegerTooSmall,
CborInvalidType,
CborTooShort,
CborUnsupportedType, CborUnsupportedType,
NoSpaceLeft, NoSpaceLeft,
OutOfMemory,
Overflow,
SyntaxError, SyntaxError,
UnexpectedEndOfInput, UnexpectedEndOfInput,
}; });
const cbor_magic_null: u8 = 0xf6; const cbor_magic_null: u8 = 0xf6;
const cbor_magic_true: u8 = 0xf5; 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 { 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 count: usize = 0;
var token = try scanner.next(); var token = try scanner.next();
@ -1019,7 +1015,7 @@ fn jsonScanUntil(writer: anytype, scanner: *json.Scanner, end_token: anytype) Cb
.number => |v| { .number => |v| {
try partial.appendSlice(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); try partial.resize(0);
}, },
.partial_number => |v| { .partial_number => |v| {
@ -1029,7 +1025,7 @@ fn jsonScanUntil(writer: anytype, scanner: *json.Scanner, end_token: anytype) Cb
.string => |v| { .string => |v| {
try partial.appendSlice(v); try partial.appendSlice(v);
try writeString(writer, partial.slice()); try writeString(writer, partial.items);
try partial.resize(0); try partial.resize(0);
}, },
.partial_string => |v| { .partial_string => |v| {