commit c17ea5dfefcad1085b1b0cea9456709c8c3611a8
parent 610730f2314f4cdb52c64e2ef78a9d5d69402b66
Author: Randy <randy408@protonmail.com>
Date: Fri, 29 Jan 2021 19:54:58 +0100
OSS-Fuzz initial integration (#216)
* add fuzz target
* update fuzzer
* add fuzzer to build with basic entry point
* add build script
* cleanup
* build fuzz target using cmake in oss-fuzz env
* ossfuzz.sh add newline
* update build
Diffstat:
4 files changed, 93 insertions(+), 0 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
@@ -15,6 +15,7 @@ set(SO_PATCH 1)
option(UTF8PROC_INSTALL "Enable installation of utf8proc" On)
option(UTF8PROC_ENABLE_TESTING "Enable testing of utf8proc" Off)
+option(LIB_FUZZING_ENGINE "Fuzzing engine to link against" Off)
add_library (utf8proc
utf8proc.c
@@ -98,4 +99,12 @@ if(UTF8PROC_ENABLE_TESTING)
target_link_libraries(normtest utf8proc)
add_test(utf8proc.testgraphemetest graphemetest data/GraphemeBreakTest.txt)
add_test(utf8proc.testnormtest normtest data/NormalizationTest.txt)
+
+ if(LIB_FUZZING_ENGINE)
+ add_executable(fuzzer utf8proc.h test/fuzzer.c)
+ target_link_libraries(fuzzer ${LIB_FUZZING_ENGINE} utf8proc)
+ else()
+ add_executable(fuzzer utf8proc.h test/fuzz_main.c test/fuzzer.c)
+ target_link_libraries(fuzzer utf8proc)
+ endif()
endif()
diff --git a/test/fuzz_main.c b/test/fuzz_main.c
@@ -0,0 +1,54 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+/* Fuzz target entry point, works without libFuzzer */
+
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);
+
+int main(int argc, char **argv)
+{
+ FILE *f;
+ char *buf = NULL;
+ long siz_buf;
+
+ if(argc < 2)
+ {
+ fprintf(stderr, "no input file\n");
+ goto err;
+ }
+
+ f = fopen(argv[1], "rb");
+ if(f == NULL)
+ {
+ fprintf(stderr, "error opening input file %s\n", argv[1]);
+ goto err;
+ }
+
+ fseek(f, 0, SEEK_END);
+
+ siz_buf = ftell(f);
+ rewind(f);
+
+ if(siz_buf < 1) goto err;
+
+ buf = (char*)malloc(siz_buf);
+ if(buf == NULL)
+ {
+ fprintf(stderr, "malloc() failed\n");
+ goto err;
+ }
+
+ if(fread(buf, siz_buf, 1, f) != 1)
+ {
+ fprintf(stderr, "fread() failed\n");
+ goto err;
+ }
+
+ (void)LLVMFuzzerTestOneInput((uint8_t*)buf, siz_buf);
+
+err:
+ free(buf);
+
+ return 0;
+}
diff --git a/test/fuzzer.c b/test/fuzzer.c
@@ -0,0 +1,16 @@
+#include <utf8proc.h>
+
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
+{
+ if(size < 1) return 0;
+
+ if(data[size-1] != '\0') return 0;
+
+ free(utf8proc_NFD(data));
+ free(utf8proc_NFC(data));
+ free(utf8proc_NFKD(data));
+ free(utf8proc_NFKC(data));
+ free(utf8proc_NFKC_Casefold(data));
+
+ return 0;
+}
+\ No newline at end of file
diff --git a/test/ossfuzz.sh b/test/ossfuzz.sh
@@ -0,0 +1,13 @@
+#!/bin/bash -eu
+# This script is meant to be run by
+# https://github.com/google/oss-fuzz/blob/master/projects/utf8proc/Dockerfile
+
+mkdir build
+cd build
+cmake .. -DUTF8PROC_ENABLE_TESTING=ON -DLIB_FUZZING_ENGINE="$LIB_FUZZING_ENGINE"
+make -j$(nproc)
+
+cp $SRC/utf8proc/build/fuzzer utf8proc_fuzzer
+
+find $SRC/utf8proc/test -name "*.txt" | \
+ xargs zip $OUT/utf8proc_fuzzer_seed_corpus.zip