Skip to content

Commit

Permalink
OSS-Fuzz initial integration (#216)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
randy408 authored Jan 29, 2021
1 parent 610730f commit c17ea5d
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 0 deletions.
9 changes: 9 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
54 changes: 54 additions & 0 deletions test/fuzz_main.c
Original file line number Diff line number Diff line change
@@ -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;
}
16 changes: 16 additions & 0 deletions test/fuzzer.c
Original file line number Diff line number Diff line change
@@ -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;
}
13 changes: 13 additions & 0 deletions test/ossfuzz.sh
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit c17ea5d

Please sign in to comment.