From f8e26ba0aa6a3aa483a01cfe2686f51a2dc543c4 Mon Sep 17 00:00:00 2001 From: Arthur Chan Date: Tue, 10 Nov 2026 08:10:03 +0000 Subject: [PATCH] OSS-Fuzz: Enable new fuzzer targets json parsing Signed-off-by: Arthur Chan --- Makefile | 5 +- fuzz/fuzz_json.c | 141 ++++-------------- fuzz/fuzz_json.dict | 19 +++ fuzz/fuzz_json_seeds/bom.json | 1 + fuzz/fuzz_json_seeds/dup-keys.json | 1 + fuzz/fuzz_json_seeds/empty-arr.json | 1 + fuzz/fuzz_json_seeds/empty-obj.json | 1 + fuzz/fuzz_json_seeds/empty-string.json | 1 + fuzz/fuzz_json_seeds/invalid-nan.json | 1 + fuzz/fuzz_json_seeds/invalid-raw-control.json | 1 + .../invalid-trailing-comma.json | 1 + fuzz/fuzz_json_seeds/lone-surrogate.json | 1 + fuzz/fuzz_json_seeds/long-string.json | 1 + fuzz/fuzz_json_seeds/nested-60.json | 1 + fuzz/fuzz_json_seeds/null.json | 1 + fuzz/fuzz_json_seeds/number-42.json | 1 + fuzz/fuzz_json_seeds/numbers.json | 1 + fuzz/fuzz_json_seeds/object-basic.json | 1 + fuzz/fuzz_json_seeds/string.json | 1 + fuzz/fuzz_json_seeds/true.json | 1 + fuzz/fuzz_json_seeds/unicode-escapes.json | 1 + fuzz/fuzz_json_seeds/utf8-raw.json | 1 + fuzz/fuzz_json_seeds/whitespace.json | 1 + 23 files changed, 74 insertions(+), 111 deletions(-) create mode 100644 fuzz/fuzz_json.dict create mode 100644 fuzz/fuzz_json_seeds/bom.json create mode 100644 fuzz/fuzz_json_seeds/dup-keys.json create mode 100644 fuzz/fuzz_json_seeds/empty-arr.json create mode 100644 fuzz/fuzz_json_seeds/empty-obj.json create mode 100644 fuzz/fuzz_json_seeds/empty-string.json create mode 100644 fuzz/fuzz_json_seeds/invalid-nan.json create mode 100644 fuzz/fuzz_json_seeds/invalid-raw-control.json create mode 100644 fuzz/fuzz_json_seeds/invalid-trailing-comma.json create mode 100644 fuzz/fuzz_json_seeds/lone-surrogate.json create mode 100644 fuzz/fuzz_json_seeds/long-string.json create mode 100644 fuzz/fuzz_json_seeds/nested-60.json create mode 100644 fuzz/fuzz_json_seeds/null.json create mode 100644 fuzz/fuzz_json_seeds/number-42.json create mode 100644 fuzz/fuzz_json_seeds/numbers.json create mode 100644 fuzz/fuzz_json_seeds/object-basic.json create mode 100644 fuzz/fuzz_json_seeds/string.json create mode 100644 fuzz/fuzz_json_seeds/true.json create mode 100644 fuzz/fuzz_json_seeds/unicode-escapes.json create mode 100644 fuzz/fuzz_json_seeds/utf8-raw.json create mode 100644 fuzz/fuzz_json_seeds/whitespace.json diff --git a/Makefile b/Makefile index 94684e1802..5f995789b6 100644 --- a/Makefile +++ b/Makefile @@ -295,7 +295,10 @@ fuzz_compile: $(OBJDIR)/fuzz_compile.o $(OBJDIR)/fuzz_common.o libquickjs.fuzz.a fuzz_regexp: $(OBJDIR)/fuzz_regexp.o $(OBJDIR)/libregexp.fuzz.o $(OBJDIR)/cutils.fuzz.o $(OBJDIR)/libunicode.fuzz.o $(CC) $(CFLAGS_OPT) $^ -o fuzz_regexp $(LIB_FUZZING_ENGINE) -libfuzzer: fuzz_eval fuzz_compile fuzz_regexp +fuzz_json: $(OBJDIR)/fuzz_json.o libquickjs.fuzz.a + $(CC) $(CFLAGS_OPT) $^ -o fuzz_json $(LIB_FUZZING_ENGINE) + +libfuzzer: fuzz_eval fuzz_compile fuzz_regexp fuzz_json ifneq ($(CROSS_PREFIX),) diff --git a/fuzz/fuzz_json.c b/fuzz/fuzz_json.c index a9c331d2ce..68601a09eb 100644 --- a/fuzz/fuzz_json.c +++ b/fuzz/fuzz_json.c @@ -1,131 +1,52 @@ // Copyright 2025 Google LLC -// Fuzz target for QuickJS JSON operations +// Fuzz target for the QuickJS JSON parser. The raw fuzzer input is fed +// directly to JS_ParseJSON, the entry point behind JSON.parse(), so the +// fuzzer exercises the parser itself instead of having to mutate valid JS +// source containing JSON literals. No script execution and no +// quickjs-libc modules are involved; memory and stack limits are set +// explicitly so that pathological inputs surface parser bugs rather than +// harness artifacts. #include "quickjs.h" -#include "quickjs-libc.h" + #include -#include #include -#include int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { - if (size < 1) return 0; - - JSRuntime* rt = JS_NewRuntime(); - if (!rt) return 0; - - JSContext* ctx = JS_NewContext(rt); + if (size == 0) + return 0; + + JSRuntime *rt = JS_NewRuntime(); + if (!rt) + return 0; + JS_SetMemoryLimit(rt, 64 << 20); /* 64 MB */ + JS_SetMaxStackSize(rt, 512 << 10); /* 512 KB */ + JSContext *ctx = JS_NewContext(rt); if (!ctx) { JS_FreeRuntime(rt); return 0; } - - char* input = malloc(size + 1); - if (!input) { + + /* JS_ParseJSON requires a zero-terminated buffer (buf[buf_len] == '\0'). */ + char *buf = malloc(size + 1); + if (!buf) { JS_FreeContext(ctx); JS_FreeRuntime(rt); return 0; } - memcpy(input, data, size); - input[size] = '\0'; - - char parse_script[8192]; - snprintf(parse_script, sizeof(parse_script), - "JSON.parse(JSON.stringify(%s))", input); - - JSValue parse_result = JS_Eval(ctx, parse_script, strlen(parse_script), - "", 0); - - if (JS_IsException(parse_result)) { - JS_GetException(ctx); - } else { - JS_FreeValue(ctx, parse_result); - } - - char direct_parse[16384]; - snprintf(direct_parse, sizeof(direct_parse), "JSON.parse('"); - - size_t script_len = strlen(direct_parse); - for (size_t i = 0; i < size && script_len < sizeof(direct_parse) - 20; i++) { - char c = input[i]; - if (c == '\\' || c == '\'') { - direct_parse[script_len++] = '\\'; - } - if (c >= 32 && c < 127) { - direct_parse[script_len++] = c; - } - } - strcat(direct_parse + script_len, "');"); - - JSValue direct_result = JS_Eval(ctx, direct_parse, strlen(direct_parse), - "", 0); - if (JS_IsException(direct_result)) { - JS_GetException(ctx); - } else { - JS_FreeValue(ctx, direct_result); - } - - char stringify_script[8192]; - snprintf(stringify_script, sizeof(stringify_script), - "var obj = { data: %s, num: 123, str: 'test', bool: true, nullv: null, " - "arr: [1,2,3], nested: { a: 1 } }; JSON.stringify(obj);", - input); - - JSValue stringify_result = JS_Eval(ctx, stringify_script, - strlen(stringify_script), "", 0); - if (JS_IsException(stringify_result)) { - JS_GetException(ctx); - } else { - const char* str = JS_ToCString(ctx, stringify_result); - if (str) { - JS_FreeCString(ctx, str); - } - JS_FreeValue(ctx, stringify_result); - } - - const char* spacing_tests[] = { - "JSON.stringify({a:1,b:2})", - "JSON.stringify({a:1,b:2}, null, 2)", - "JSON.stringify({a:1,b:2}, null, ' ')", - "JSON.stringify([1,2,3])", - "JSON.stringify(null)", - "JSON.stringify(undefined)", - "JSON.stringify(123)", - "JSON.stringify('string')", - "JSON.stringify(true)", - }; - - for (size_t i = 0; i < sizeof(spacing_tests) / sizeof(spacing_tests[0]); i++) { - JSValue r = JS_Eval(ctx, spacing_tests[i], strlen(spacing_tests[i]), - "", 0); - if (!JS_IsException(r)) { - JS_FreeValue(ctx, r); - } else { - JS_GetException(ctx); - } - } - - const char* reviver_test = "JSON.parse('{\"a\":1,\"b\":2}', function(k,v) { return v; })"; - JSValue reviver_result = JS_Eval(ctx, reviver_test, strlen(reviver_test), - "", 0); - if (!JS_IsException(reviver_result)) { - JS_FreeValue(ctx, reviver_result); - } else { - JS_GetException(ctx); - } - - const char* replacer_test = "JSON.stringify({a:1,b:2}, function(k,v) { return v; })"; - JSValue replacer_result = JS_Eval(ctx, replacer_test, strlen(replacer_test), - "", 0); - if (!JS_IsException(replacer_result)) { - JS_FreeValue(ctx, replacer_result); + memcpy(buf, data, size); + buf[size] = '\0'; + + JSValue obj = JS_ParseJSON(ctx, buf, size, ""); + if (JS_IsException(obj)) { + JSValue exc = JS_GetException(ctx); + JS_FreeValue(ctx, exc); } else { - JS_GetException(ctx); + JS_FreeValue(ctx, obj); } - - free(input); + free(buf); + JS_FreeContext(ctx); JS_FreeRuntime(rt); - return 0; } diff --git a/fuzz/fuzz_json.dict b/fuzz/fuzz_json.dict new file mode 100644 index 0000000000..c022624a0c --- /dev/null +++ b/fuzz/fuzz_json.dict @@ -0,0 +1,19 @@ +"{}" +"[]" +"\"\"" +"\": \"" +"\": 1" +", \"" +"true" +"false" +"null" +"NaN" +"Infinity" +"\\u0000" +"\\ud83d\\ude00" +"\\n" +"\\\\" +"1e999" +"-0" +"0.5e-3" +"[[[[]]]]" diff --git a/fuzz/fuzz_json_seeds/bom.json b/fuzz/fuzz_json_seeds/bom.json new file mode 100644 index 0000000000..22fdca1b26 --- /dev/null +++ b/fuzz/fuzz_json_seeds/bom.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/dup-keys.json b/fuzz/fuzz_json_seeds/dup-keys.json new file mode 100644 index 0000000000..af6aad3ee9 --- /dev/null +++ b/fuzz/fuzz_json_seeds/dup-keys.json @@ -0,0 +1 @@ +{"a": 1, "a": {"a": 2}} \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/empty-arr.json b/fuzz/fuzz_json_seeds/empty-arr.json new file mode 100644 index 0000000000..0637a088a0 --- /dev/null +++ b/fuzz/fuzz_json_seeds/empty-arr.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/empty-obj.json b/fuzz/fuzz_json_seeds/empty-obj.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/fuzz/fuzz_json_seeds/empty-obj.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/empty-string.json b/fuzz/fuzz_json_seeds/empty-string.json new file mode 100644 index 0000000000..3cc762b550 --- /dev/null +++ b/fuzz/fuzz_json_seeds/empty-string.json @@ -0,0 +1 @@ +"" \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/invalid-nan.json b/fuzz/fuzz_json_seeds/invalid-nan.json new file mode 100644 index 0000000000..375b9d43b6 --- /dev/null +++ b/fuzz/fuzz_json_seeds/invalid-nan.json @@ -0,0 +1 @@ +[NaN, Infinity, -Infinity] \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/invalid-raw-control.json b/fuzz/fuzz_json_seeds/invalid-raw-control.json new file mode 100644 index 0000000000..094d981581 --- /dev/null +++ b/fuzz/fuzz_json_seeds/invalid-raw-control.json @@ -0,0 +1 @@ +{"a": "raw control"} \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/invalid-trailing-comma.json b/fuzz/fuzz_json_seeds/invalid-trailing-comma.json new file mode 100644 index 0000000000..250efc38dd --- /dev/null +++ b/fuzz/fuzz_json_seeds/invalid-trailing-comma.json @@ -0,0 +1 @@ +[1, 2,] \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/lone-surrogate.json b/fuzz/fuzz_json_seeds/lone-surrogate.json new file mode 100644 index 0000000000..d37469f06f --- /dev/null +++ b/fuzz/fuzz_json_seeds/lone-surrogate.json @@ -0,0 +1 @@ +"\ud800 lone half" \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/long-string.json b/fuzz/fuzz_json_seeds/long-string.json new file mode 100644 index 0000000000..18fb0371f2 --- /dev/null +++ b/fuzz/fuzz_json_seeds/long-string.json @@ -0,0 +1 @@ +{"s": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"} \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/nested-60.json b/fuzz/fuzz_json_seeds/nested-60.json new file mode 100644 index 0000000000..21a9ce7ef0 --- /dev/null +++ b/fuzz/fuzz_json_seeds/nested-60.json @@ -0,0 +1 @@ +[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/null.json b/fuzz/fuzz_json_seeds/null.json new file mode 100644 index 0000000000..ec747fa47d --- /dev/null +++ b/fuzz/fuzz_json_seeds/null.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/number-42.json b/fuzz/fuzz_json_seeds/number-42.json new file mode 100644 index 0000000000..f70d7bba4a --- /dev/null +++ b/fuzz/fuzz_json_seeds/number-42.json @@ -0,0 +1 @@ +42 \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/numbers.json b/fuzz/fuzz_json_seeds/numbers.json new file mode 100644 index 0000000000..014922904f --- /dev/null +++ b/fuzz/fuzz_json_seeds/numbers.json @@ -0,0 +1 @@ +[0, -0, 1e999, 1e-999, 3.14159, 9007199254740993, 1E+2, 0.5e-3, 123456789012345678901234567890] \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/object-basic.json b/fuzz/fuzz_json_seeds/object-basic.json new file mode 100644 index 0000000000..c553868bfb --- /dev/null +++ b/fuzz/fuzz_json_seeds/object-basic.json @@ -0,0 +1 @@ +{"a": 1, "b": [true, false, null], "c": {"d": "s"}} \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/string.json b/fuzz/fuzz_json_seeds/string.json new file mode 100644 index 0000000000..ba8d60bffe --- /dev/null +++ b/fuzz/fuzz_json_seeds/string.json @@ -0,0 +1 @@ +"text with \\"quotes\\" and back\\\\slash" \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/true.json b/fuzz/fuzz_json_seeds/true.json new file mode 100644 index 0000000000..f32a5804e2 --- /dev/null +++ b/fuzz/fuzz_json_seeds/true.json @@ -0,0 +1 @@ +true \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/unicode-escapes.json b/fuzz/fuzz_json_seeds/unicode-escapes.json new file mode 100644 index 0000000000..4d99161751 --- /dev/null +++ b/fuzz/fuzz_json_seeds/unicode-escapes.json @@ -0,0 +1 @@ +{"e": "\u00e9\ud83d\ude00", "half": "\ud83d", "esc": "a\u0000b"} \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/utf8-raw.json b/fuzz/fuzz_json_seeds/utf8-raw.json new file mode 100644 index 0000000000..af2ac9116f --- /dev/null +++ b/fuzz/fuzz_json_seeds/utf8-raw.json @@ -0,0 +1 @@ +{"emoji": "\xf0\x9f\x98\x80", "cjk": "\xe4\xb8\xad\xe6\x96\x87", "comb": "a\xcc\x81"} \ No newline at end of file diff --git a/fuzz/fuzz_json_seeds/whitespace.json b/fuzz/fuzz_json_seeds/whitespace.json new file mode 100644 index 0000000000..86248058f8 --- /dev/null +++ b/fuzz/fuzz_json_seeds/whitespace.json @@ -0,0 +1 @@ +{\n\t"k": [1, 2],\r\n\t"j": {"inner": true}\n} \ No newline at end of file