From c02b40e58f35ecd10c4945d2fa2b7074137c2c04 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Tue, 17 Apr 2018 08:21:22 -0600 Subject: [PATCH] [subset] add a fuzzer target for subset_get_all_codepoints method. (#987) --- test/fuzzing/CMakeLists.txt | 7 ++++++- test/fuzzing/Makefile.am | 16 ++++++++++++++++ test/fuzzing/hb-subset-get-codepoints-fuzzer.cc | 24 ++++++++++++++++++++++++ test/fuzzing/run-subset-fuzzer-tests.py | 19 ++++++++++++++++++- 4 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 test/fuzzing/hb-subset-get-codepoints-fuzzer.cc diff --git a/test/fuzzing/CMakeLists.txt b/test/fuzzing/CMakeLists.txt index 577d13c..2a45ef6 100644 --- a/test/fuzzing/CMakeLists.txt +++ b/test/fuzzing/CMakeLists.txt @@ -2,6 +2,7 @@ if (HB_CHECK) file (READ "${CMAKE_CURRENT_SOURCE_DIR}/Makefile.am" MAKEFILEAM) extract_make_variable (hb_shape_fuzzer_SOURCES ${MAKEFILEAM}) extract_make_variable (hb_subset_fuzzer_SOURCES ${MAKEFILEAM}) + extract_make_variable (hb_subset_get_codepoints_fuzzer_SOURCES ${MAKEFILEAM}) # TODO: enable these two #extract_make_variable (FUZZING_CPPFLAGS ${MAKEFILEAM}) # extracting regex fail @@ -15,13 +16,17 @@ if (HB_CHECK) add_executable (hb-subset-fuzzer ${hb_subset_fuzzer_SOURCES}) target_link_libraries (hb-subset-fuzzer harfbuzz-subset) + add_executable (hb-subset-get-codepoints-fuzzer ${hb_subset_get_codepoints_fuzzer_SOURCES}) + target_link_libraries (hb-subset-get-codepoints-fuzzer harfbuzz-subset) + target_compile_definitions(hb-shape-fuzzer PUBLIC ${FUZZING_CPPFLAGS}) target_compile_definitions(hb-subset-fuzzer PUBLIC ${FUZZING_CPPFLAGS}) + target_compile_definitions(hb-subset-get-codepoints-fuzzer PUBLIC ${FUZZING_CPPFLAGS}) add_test (NAME hb-shape-fuzzer COMMAND "${PYTHON_EXECUTABLE}" run-shape-fuzzer-tests.py $ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) add_test (NAME hb-subset-fuzzer - COMMAND "${PYTHON_EXECUTABLE}" run-subset-fuzzer-tests.py $ + COMMAND "${PYTHON_EXECUTABLE}" run-subset-fuzzer-tests.py $ $ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) endif () diff --git a/test/fuzzing/Makefile.am b/test/fuzzing/Makefile.am index a57f41d..5af5a73 100644 --- a/test/fuzzing/Makefile.am +++ b/test/fuzzing/Makefile.am @@ -23,6 +23,7 @@ EXTRA_DIST += \ check_PROGRAMS = \ hb-shape-fuzzer \ hb-subset-fuzzer \ + hb-subset-get-codepoints-fuzzer \ $(NULL) AM_CPPFLAGS = \ @@ -64,6 +65,21 @@ hb_subset_fuzzer_DEPENDENCIES = \ lib \ $(NULL) +hb_subset_get_codepoints_fuzzer_SOURCES = \ + hb-fuzzer.hh \ + hb-subset-get-codepoints-fuzzer.cc \ + main.cc \ + $(NULL) +hb_subset_get_codepoints_fuzzer_LDADD = \ + $(top_builddir)/src/libharfbuzz-subset-fuzzing.la \ + $(NULL) +hb_subset_get_codepoints_fuzzer_CPPFLAGS = \ + $(AM_CPPFLAGS) \ + $(NULL) +hb_subset_get_codepoints_fuzzer_DEPENDENCIES = \ + lib \ + $(NULL) + check: EXEEXT="$(EXEEXT)" srcdir="$(srcdir)" builddir="$(builddir)" $(srcdir)/run-shape-fuzzer-tests.py EXEEXT="$(EXEEXT)" srcdir="$(srcdir)" builddir="$(builddir)" $(srcdir)/run-subset-fuzzer-tests.py diff --git a/test/fuzzing/hb-subset-get-codepoints-fuzzer.cc b/test/fuzzing/hb-subset-get-codepoints-fuzzer.cc new file mode 100644 index 0000000..c20b1fc --- /dev/null +++ b/test/fuzzing/hb-subset-get-codepoints-fuzzer.cc @@ -0,0 +1,24 @@ +#include "hb-fuzzer.hh" + +#include +#include +#include + +#include "hb-subset.h" + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + printf ("hb-subset-get-codepoints-fuzzer: input size = %zu\n", size); + hb_blob_t *blob = hb_blob_create ((const char *)data, size, + HB_MEMORY_MODE_READONLY, NULL, NULL); + hb_face_t *face = hb_face_create (blob, 0); + + hb_set_t *output = hb_set_create(); + hb_subset_get_all_codepoints (face, output); + + hb_set_destroy (output); + hb_face_destroy (face); + hb_blob_destroy (blob); + + return 0; +} diff --git a/test/fuzzing/run-subset-fuzzer-tests.py b/test/fuzzing/run-subset-fuzzer-tests.py index 2357523..0136288 100755 --- a/test/fuzzing/run-subset-fuzzer-tests.py +++ b/test/fuzzing/run-subset-fuzzer-tests.py @@ -8,15 +8,24 @@ srcdir = os.environ.get ("srcdir", ".") EXEEXT = os.environ.get ("EXEEXT", "") top_builddir = os.environ.get ("top_builddir", ".") hb_subset_fuzzer = os.path.join (top_builddir, "hb-subset-fuzzer" + EXEEXT) +hb_subset_get_codepoints_fuzzer = os.path.join (top_builddir, "hb-subset-get-codepoints-fuzzer" + EXEEXT) if not os.path.exists (hb_subset_fuzzer): - if len (sys.argv) == 1 or not os.path.exists (sys.argv[1]): + if len (sys.argv) < 2 or not os.path.exists (sys.argv[1]): print ("""Failed to find hb-subset-fuzzer binary automatically, please provide it as the first argument to the tool""") sys.exit (1) hb_subset_fuzzer = sys.argv[1] +if not os.path.exists (hb_subset_get_codepoints_fuzzer): + if len (sys.argv) < 3 or not os.path.exists (sys.argv[2]): + print ("""Failed to find hb-subset-get-codepoints-fuzzer binary automatically, +please provide it as the second argument to the tool""") + sys.exit (1) + + hb_subset_get_codepoints_fuzzer = sys.argv[2] + print ('hb_subset_fuzzer:', hb_subset_fuzzer) fails = 0 @@ -24,6 +33,7 @@ parent_path = os.path.join (srcdir, "..", "subset", "data", "fonts") print ("running subset fuzzer against fonts in %s" % parent_path) for file in os.listdir (parent_path): path = os.path.join(parent_path, file) + print ("running subset fuzzer against %s" % path) p = subprocess.Popen ([hb_subset_fuzzer, path]) @@ -31,6 +41,13 @@ for file in os.listdir (parent_path): print ("failed for %s" % path) fails = fails + 1 + print ("running subset get codepoints fuzzer against %s" % path) + p = subprocess.Popen ([hb_subset_get_codepoints_fuzzer, path]) + + if p.wait () != 0: + print ("failed for %s" % path) + fails = fails + 1 + if fails: print ("%i subset fuzzer related tests failed." % fails) sys.exit (1) -- 2.7.4