added fuzzer and fixed a couple of bugs found by it

This commit is contained in:
cozis
2022-04-25 00:56:35 +02:00
parent f89d0ce6d2
commit 131fc7f009
5 changed files with 50 additions and 2 deletions
+3 -1
View File
@@ -1,7 +1,9 @@
out
test test
vgcore.* vgcore.*
*.gcno *.gcno
*.gcda *.gcda
*.gcov *.gcov
parse-file parse-file
all.json samples
fuzzer
+1
View File
@@ -1,3 +1,4 @@
rm *.gcda rm *.gcda
rm *.gcno rm *.gcno
rm *.gcov
rm vgcore.* rm vgcore.*
+33
View File
@@ -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;
}
Executable
+4
View File
@@ -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
+9 -1
View File
@@ -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;