added fuzzer and fixed a couple of bugs found by it
This commit is contained in:
+3
-1
@@ -1,7 +1,9 @@
|
|||||||
|
out
|
||||||
test
|
test
|
||||||
vgcore.*
|
vgcore.*
|
||||||
*.gcno
|
*.gcno
|
||||||
*.gcda
|
*.gcda
|
||||||
*.gcov
|
*.gcov
|
||||||
parse-file
|
parse-file
|
||||||
all.json
|
samples
|
||||||
|
fuzzer
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
rm *.gcda
|
rm *.gcda
|
||||||
rm *.gcno
|
rm *.gcno
|
||||||
|
rm *.gcov
|
||||||
rm vgcore.*
|
rm vgcore.*
|
||||||
@@ -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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int exponent_start = ctx->i;
|
||||||
|
|
||||||
_Bool negative_exponent = 0;
|
_Bool negative_exponent = 0;
|
||||||
if(ctx->str[ctx->i] == '+' || ctx->str[ctx->i] == '-')
|
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]))
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -968,6 +970,12 @@ static xj_value *parse_number(context_t *ctx)
|
|||||||
ctx->i += 1;
|
ctx->i += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(exponent > 6)
|
||||||
|
{
|
||||||
|
xj_preport(ctx->error, ctx->str, exponent_start, "Exponent is too big");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
coeff = 1;
|
coeff = 1;
|
||||||
for(int j = 0; j < exponent; j += 1)
|
for(int j = 0; j < exponent; j += 1)
|
||||||
coeff *= 10;
|
coeff *= 10;
|
||||||
|
|||||||
Reference in New Issue
Block a user