From b6a9e260cd1c76d795a1a85f2ccfd38f783dc79a Mon Sep 17 00:00:00 2001 From: Ze Sheng <108382772+OwenSanzas@users.noreply.github.com> Date: Tue, 10 Mar 2026 21:49:14 -0500 Subject: [PATCH] fix jq_fuzz_parse_stream: use iterative parser API for streaming mode (#3499) --- tests/jq_fuzz_parse_stream.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/tests/jq_fuzz_parse_stream.c b/tests/jq_fuzz_parse_stream.c index 5b51c599..1a89073f 100644 --- a/tests/jq_fuzz_parse_stream.c +++ b/tests/jq_fuzz_parse_stream.c @@ -5,15 +5,27 @@ #include "jv.h" int LLVMFuzzerTestOneInput(uint8_t *data, size_t size) { - // Creat null-terminated string + // Create null-terminated string char *null_terminated = (char *)malloc(size + 1); memcpy(null_terminated, (char *)data, size); null_terminated[size] = '\0'; - // Fuzzer entrypoint - jv res = jv_parse_custom_flags(null_terminated, JV_PARSE_STREAMING); - jv_free(res); - + // Use the iterative jv_parser API for streaming mode. + // The single-shot jv_parse_custom_flags() returns "Unexpected extra JSON + // values" for any compound JSON in streaming mode, because the streaming + // parser produces multiple tokens but the single-shot API expects exactly + // one value. + jv_parser *parser = jv_parser_new(JV_PARSE_STREAMING); + jv_parser_set_buf(parser, null_terminated, (int)size, 0); + + jv value; + while (jv_is_valid(value = jv_parser_next(parser))) { + jv_free(value); + } + jv_free(value); + + jv_parser_free(parser); + // Free the null-terminated string free(null_terminated);