diff --git a/test/fuzzers/fuzz_dostring.c b/test/fuzzers/fuzz_dostring.c index 625ab0a4..17834432 100644 --- a/test/fuzzers/fuzz_dostring.c +++ b/test/fuzzers/fuzz_dostring.c @@ -3,20 +3,44 @@ #include int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { - char *new_str = (char *)malloc(size + 1); - if (new_str == NULL) { - return 0; - } - memcpy(new_str, data, size); - new_str[size] = '\0'; - /* janet logic */ + /* init Janet */ janet_init(); - JanetTable *env = janet_core_env(NULL); - janet_dostring(env, new_str, "main", NULL); + + /* fuzz the parser */ + JanetParser parser; + janet_parser_init(&parser); + for (int i=0, done = 0; i < size; i++) + { + switch (janet_parser_status(&parser)) { + case JANET_PARSE_DEAD: + case JANET_PARSE_ERROR: + done = 1; + break; + case JANET_PARSE_PENDING: + if (i == size) { + janet_parser_eof(&parser); + } else { + janet_parser_consume(&parser, data[i]); + } + break; + case JANET_PARSE_ROOT: + if (i >= size) { + janet_parser_eof(&parser); + } else { + janet_parser_consume(&parser, data[i]); + } + break; + } + + if (done == 1) + break; + } + janet_parser_deinit(&parser); + + /* cleanup Janet */ janet_deinit(); - free(new_str); return 0; }