added fuzzer and fixed a couple of bugs found by it
This commit is contained in:
+3
-1
@@ -1,7 +1,9 @@
|
||||
out
|
||||
test
|
||||
vgcore.*
|
||||
*.gcno
|
||||
*.gcda
|
||||
*.gcov
|
||||
parse-file
|
||||
all.json
|
||||
samples
|
||||
fuzzer
|
||||
@@ -0,0 +1,33 @@
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include "xjson.h"
|
||||
|
||||
__AFL_FUZZ_INIT();
|
||||
|
||||
int main()
|
||||
{
|
||||
|
||||
#ifdef __AFL_HAVE_MANUAL_CONTROL
|
||||
__AFL_INIT();
|
||||
#endif
|
||||
|
||||
unsigned char *buf = __AFL_FUZZ_TESTCASE_BUF; // must be after __AFL_INIT
|
||||
// and before __AFL_LOOP!
|
||||
char pool[65536];
|
||||
xj_error error;
|
||||
|
||||
while(__AFL_LOOP(10000))
|
||||
{
|
||||
int len = __AFL_FUZZ_TESTCASE_LEN;
|
||||
|
||||
xj_alloc *alloc = xj_alloc_using(pool, sizeof(pool), 4096, NULL);
|
||||
assert(alloc != NULL);
|
||||
|
||||
xj_decode(buf, len, alloc, &error);
|
||||
|
||||
xj_alloc_del(alloc);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
afl-clang-fast fuzzer.c xjson.c -o fuzzer
|
||||
export AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1
|
||||
export AFL_SKIP_CPUFREQ=1
|
||||
afl-fuzz -i samples/ -o out -m none -d -- ./fuzzer
|
||||
@@ -939,6 +939,8 @@ static xj_value *parse_number(context_t *ctx)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int exponent_start = ctx->i;
|
||||
|
||||
_Bool negative_exponent = 0;
|
||||
if(ctx->str[ctx->i] == '+' || ctx->str[ctx->i] == '-')
|
||||
{
|
||||
@@ -956,7 +958,7 @@ static xj_value *parse_number(context_t *ctx)
|
||||
|
||||
if(!isdigit(ctx->str[ctx->i]))
|
||||
{
|
||||
xj_report(ctx->error, ctx->str, ctx->i, "Expected digit as exponent");
|
||||
xj_preport(ctx->error, ctx->str, ctx->i, "Expected digit as exponent");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -968,6 +970,12 @@ static xj_value *parse_number(context_t *ctx)
|
||||
ctx->i += 1;
|
||||
}
|
||||
|
||||
if(exponent > 6)
|
||||
{
|
||||
xj_preport(ctx->error, ctx->str, exponent_start, "Exponent is too big");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
coeff = 1;
|
||||
for(int j = 0; j < exponent; j += 1)
|
||||
coeff *= 10;
|
||||
|
||||
Reference in New Issue
Block a user