tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

fuzzing_include_am.py (3981B)


      1 #!/usr/bin/env python
      2 
      3 # Future imports for Python 2.7, mandatory in 3.0
      4 from __future__ import division
      5 from __future__ import print_function
      6 from __future__ import unicode_literals
      7 
      8 FUZZERS = """
      9 address
     10 addressPTR
     11 consensus
     12 descriptor
     13 diff
     14 diff-apply
     15 extrainfo
     16 hsdescv3
     17    hsdescv3-inner
     18    hsdescv3-middle
     19 http
     20 http-connect
     21 microdesc
     22 socks
     23 strops
     24 vrs
     25 """
     26 
     27 
     28 PREAMBLE = r"""
     29 FUZZING_CPPFLAGS = \
     30 $(src_test_AM_CPPFLAGS) $(TEST_CPPFLAGS)
     31 FUZZING_CFLAGS = \
     32 $(AM_CFLAGS) $(TEST_CFLAGS)
     33 FUZZING_LDFLAG = \
     34 @TOR_LDFLAGS_zlib@ $(TOR_LDFLAGS_CRYPTLIB) @TOR_LDFLAGS_libevent@
     35 FUZZING_LIBS = \
     36 src/test/libtor-testing.a \
     37 @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \
     38 @TOR_LIBEVENT_LIBS@ $(TOR_LIBS_CRYPTLIB) \
     39 @TOR_LIB_WS32@ @TOR_LIB_IPHLPAPI@ @TOR_LIB_SHLWAPI@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ @CURVE25519_LIBS@ \
     40 @TOR_SYSTEMD_LIBS@ \
     41 @TOR_LZMA_LIBS@ \
     42 @TOR_ZSTD_LIBS@ \
     43 @TOR_TRACE_LIBS@
     44 
     45 oss-fuzz-prereqs: \
     46    src/test/libtor-testing.a
     47 
     48 noinst_HEADERS += \
     49 src/test/fuzz/fuzzing.h
     50 
     51 LIBFUZZER_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ
     52 LIBFUZZER_CFLAGS = $(FUZZING_CFLAGS)
     53 LIBFUZZER_LDFLAG = $(FUZZING_LDFLAG) -fsanitize=fuzzer,float-divide-by-zero
     54 LIBFUZZER_LIBS = $(FUZZING_LIBS) -lstdc++
     55 
     56 LIBOSS_FUZZ_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ
     57 LIBOSS_FUZZ_CFLAGS = $(FUZZING_CFLAGS)
     58 """
     59 
     60 POSTAMBLE = r"""
     61 noinst_PROGRAMS += $(FUZZERS) $(LIBFUZZER_FUZZERS)
     62 noinst_LIBRARIES += $(OSS_FUZZ_FUZZERS)
     63 oss-fuzz-fuzzers:  oss-fuzz-prereqs $(OSS_FUZZ_FUZZERS)
     64 fuzzers: $(FUZZERS) $(LIBFUZZER_FUZZERS)
     65 
     66 test-fuzz-corpora: $(FUZZERS)
     67 $(top_srcdir)/src/test/fuzz_static_testcases.sh
     68 """
     69 
     70 ########### No user serviceable parts will follow.
     71 
     72 PREAMBLE = PREAMBLE.strip()
     73 POSTAMBLE = POSTAMBLE.strip()  # If I use it, it's a word!
     74 FUZZERS = FUZZERS.split()
     75 FUZZERS.sort()
     76 
     77 WARNING = """
     78 # This file was generated by fuzzing_include_am.py; do not hand-edit unless
     79 # you enjoy having your changes erased.
     80 """.strip()
     81 
     82 print(WARNING)
     83 
     84 print(PREAMBLE)
     85 
     86 print("\n# ===== AFL fuzzers")
     87 
     88 def get_id_name(s):
     89    return s.replace("-", "_")
     90 
     91 for fuzzer in FUZZERS:
     92    idname = get_id_name(fuzzer)
     93    print("""\
     94 if UNITTESTS_ENABLED
     95 src_test_fuzz_fuzz_{name}_SOURCES = \\
     96 src/test/fuzz/fuzzing_common.c \\
     97 src/test/fuzz/fuzz_{name}.c
     98 src_test_fuzz_fuzz_{name}_CPPFLAGS = $(FUZZING_CPPFLAGS)
     99 src_test_fuzz_fuzz_{name}_CFLAGS = $(FUZZING_CFLAGS)
    100 src_test_fuzz_fuzz_{name}_LDFLAGS = $(FUZZING_LDFLAG)
    101 src_test_fuzz_fuzz_{name}_LDADD = $(FUZZING_LIBS)
    102 endif
    103 """.format(name=idname))
    104 
    105 print("if UNITTESTS_ENABLED")
    106 print("FUZZERS = \\")
    107 print(" \\\n".join("\tsrc/test/fuzz/fuzz-{name}".format(name=fuzzer)
    108                   for fuzzer in FUZZERS))
    109 print("endif")
    110 
    111 print("\n# ===== libfuzzer")
    112 print("\nif LIBFUZZER_ENABLED")
    113 
    114 for fuzzer in FUZZERS:
    115    idname = get_id_name(fuzzer)
    116    print("""\
    117 if UNITTESTS_ENABLED
    118 src_test_fuzz_lf_fuzz_{name}_SOURCES = \\
    119 $(src_test_fuzz_fuzz_{name}_SOURCES)
    120 src_test_fuzz_lf_fuzz_{name}_CPPFLAGS = $(LIBFUZZER_CPPFLAGS)
    121 src_test_fuzz_lf_fuzz_{name}_CFLAGS = $(LIBFUZZER_CFLAGS)
    122 src_test_fuzz_lf_fuzz_{name}_LDFLAGS = $(LIBFUZZER_LDFLAG)
    123 src_test_fuzz_lf_fuzz_{name}_LDADD = $(LIBFUZZER_LIBS)
    124 endif
    125 """.format(name=idname))
    126 
    127 print("LIBFUZZER_FUZZERS = \\")
    128 print(" \\\n".join("\tsrc/test/fuzz/lf-fuzz-{name}".format(name=fuzzer)
    129                   for fuzzer in FUZZERS))
    130 
    131 print("""
    132 else
    133 LIBFUZZER_FUZZERS =
    134 endif""")
    135 
    136 print("\n# ===== oss-fuzz\n")
    137 print("if OSS_FUZZ_ENABLED")
    138 
    139 for fuzzer in FUZZERS:
    140    idname = get_id_name(fuzzer)
    141    print("""\
    142 if UNITTESTS_ENABLED
    143 src_test_fuzz_liboss_fuzz_{name}_a_SOURCES = \\
    144 $(src_test_fuzz_fuzz_{name}_SOURCES)
    145 src_test_fuzz_liboss_fuzz_{name}_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS)
    146 src_test_fuzz_liboss_fuzz_{name}_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS)
    147 endif
    148 """.format(name=idname))
    149 
    150 print("OSS_FUZZ_FUZZERS = \\")
    151 print(" \\\n".join("\tsrc/test/fuzz/liboss-fuzz-{name}.a".format(name=fuzzer)
    152                   for fuzzer in FUZZERS))
    153 
    154 print("""
    155 else
    156 OSS_FUZZ_FUZZERS =
    157 endif""")
    158 
    159 print("")
    160 
    161 print(POSTAMBLE)