From f304dbe324bb9fe1c7b41b29d2f2f0052b2821be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20R=C3=BChsen?= Date: Wed, 14 Jun 2017 12:45:05 +0200 Subject: [PATCH] More fuzzer improvements --- fuzz/Makefile.am | 6 +++++- fuzz/libpsl_fuzzer.c | 28 ++++++++++++++++++++-------- fuzz/run-clang.sh | 9 +++++++-- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/fuzz/Makefile.am b/fuzz/Makefile.am index c323294..eb145e6 100644 --- a/fuzz/Makefile.am +++ b/fuzz/Makefile.am @@ -31,12 +31,16 @@ fuzz-coverage: $(PSL_TESTS) oss-fuzz: if test "$$OUT" != ""; then \ + if $$(ldd ../src/.libs/libpsl.so|grep -q libidn2); then XLIBS="-lidn2 -lunistring"; \ + elif $$(ldd ../src/.libs/libpsl.so|grep -q libidn); then XLIBS="-lidn -lunistring"; \ + elif $$(ldd ../src/.libs/libpsl.so|grep -q libicu); then XLIBS="-licuuc -licudata"; \ + else XLIBS=""; fi; \ for ccfile in *_fuzzer.c; do \ fuzzer=$$(basename $$ccfile .c); \ $$CXX $$CXXFLAGS -I$(top_srcdir)/include -I$(top_srcdir) \ "$${fuzzer}.c" -o "$${fuzzer}" \ ../src/.libs/libpsl.a $${LIB_FUZZING_ENGINE} -Wl,-Bstatic \ - -lidn2 -lunistring \ + $$XLIBS \ -Wl,-Bdynamic; \ done; \ fi diff --git a/fuzz/libpsl_fuzzer.c b/fuzz/libpsl_fuzzer.c index bbe70d6..fdf3a40 100644 --- a/fuzz/libpsl_fuzzer.c +++ b/fuzz/libpsl_fuzzer.c @@ -29,11 +29,16 @@ #include // malloc, free #include // memcpy +#if defined(WITH_LIBICU) +#include +#endif + #include "libpsl.h" #include "fuzzer.h" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + static int first_run = 1; char *domain = (char *) malloc(size + 1), *res; int rc; @@ -46,7 +51,6 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) psl_ctx_t *psl; psl = (psl_ctx_t *) psl_builtin(); - psl_is_public_suffix(NULL, domain); psl_is_public_suffix(psl, domain); psl_is_public_suffix2(psl, domain, PSL_TYPE_PRIVATE); psl_is_public_suffix2(psl, domain, PSL_TYPE_ICANN); @@ -65,15 +69,23 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) psl_free(psl); - psl_check_version_number(1); - psl_get_version(); - psl_dist_filename(); - psl_builtin_outdated(); - psl_builtin_filename(); - psl_builtin_sha1sum(); - psl_builtin_file_time(); + if (first_run) { + psl_is_public_suffix(NULL, domain); + psl_check_version_number(1); + psl_get_version(); + psl_dist_filename(); + psl_builtin_outdated(); + psl_builtin_filename(); + psl_builtin_sha1sum(); + psl_builtin_file_time(); + first_run = 0; + } free(domain); +#if defined(WITH_LIBICU) + u_cleanup(); // free all library internal memory to avoid memory leaks being reported +#endif + return 0; } diff --git a/fuzz/run-clang.sh b/fuzz/run-clang.sh index 1cdf335..ee41cd1 100755 --- a/fuzz/run-clang.sh +++ b/fuzz/run-clang.sh @@ -32,11 +32,16 @@ fuzzer=$1 workers=$(($(nproc) - 1)) jobs=$workers +if $(ldd ../src/.libs/libpsl.so|grep -q libidn2); then XLIBS="-lidn2 -lunistring"; \ +elif $(ldd ../src/.libs/libpsl.so|grep -q libidn); then XLIBS="-lidn -lunistring"; \ +elif $(ldd ../src/.libs/libpsl.so|grep -q libicu); then XLIBS="-licuuc -licudata"; \ +else XLIBS=""; fi; \ + clang-5.0 \ - $CFLAGS -I../include -I.. \ + $CFLAGS -Og -g -I../include -I.. \ ${fuzzer}.c -o ${fuzzer} \ -Wl,-Bstatic ../src/.libs/libpsl.a -lFuzzer \ - -Wl,-Bdynamic -lidn2 -lunistring -lclang-5.0 -lstdc++ + -Wl,-Bdynamic $XLIBS -lclang-5.0 -lstdc++ # create directory for NEW test corpora (covering new areas of code) mkdir -p ${fuzzer}.new