diff --git a/fuzzing/Jamfile b/fuzzing/Jamfile index f003cf55..4a1dc263 100644 --- a/fuzzing/Jamfile +++ b/fuzzing/Jamfile @@ -6,19 +6,45 @@ import common ; +import path ; +import python ; import regex ; +import toolset ; + +path-constant HERE : . ; local all_fuzzers = [ regex.replace-list [ glob "fuzz_*.cpp" ] : ".cpp" : "" ] ; +if ! [ python.configured ] +{ + using python ; +} + +.make-corpus-script = $(HERE)/make-corpus.py ; + +rule make-corpus ( target : sources + : properties * ) +{ + RUNNER on $(target) = [ path.native $(.make-corpus-script) ] ; +} +actions make-corpus +{ + "$(PYTHON:E=python)" "$(RUNNER)" $(<) $(>) +} +toolset.flags $(__name__).make-corpus PYTHON ; + for local fuzzer in $(all_fuzzers) { local fuzz_time = 60 ; + local corpus = /tmp/corpus/$(fuzzer) ; + local min_corpus = /tmp/mincorpus/$(fuzzer) ; + local seed_corpus = $(HERE)/seedcorpus/$(fuzzer) ; + local seed_files = [ glob "$(seed_corpus)/*" ] ; # Create the output corpus directories - make /tmp/corpus/$(fuzzer) : : common.MkDir ; - make /tmp/mincorpus/$(fuzzer) : : common.MkDir ; + make $(corpus) : $(seed_files) : make-corpus ; + make $(min_corpus) : : common.MkDir ; # Build the fuzzer exe $(fuzzer) @@ -36,19 +62,20 @@ for local fuzzer in $(all_fuzzers) # Run the fuzzer for a short while run $(fuzzer) - : "seedcorpus/$(fuzzer) -max_total_time=$(fuzz_time)" + : "$(corpus) -max_total_time=$(fuzz_time)" : target-name $(fuzzer)-fuzzing : requirements - /tmp/corpus/$(fuzzer) + $(corpus) ; # Minimize the corpus run $(fuzzer) - : "/tmp/mincorpus/$(fuzzer) /tmp/corpus/$(fuzzer) -merge=1" + : "$(min_corpus) $(corpus) -merge=1" : target-name $(fuzzer)-minimize-corpus : requirements $(fuzzer)-fuzzing - /tmp/corpus/$(fuzzer) - /tmp/mincorpus/$(fuzzer) + $(corpus) + $(min_corpus) ; -} \ No newline at end of file +} + diff --git a/fuzzing/make-corpus.py b/fuzzing/make-corpus.py new file mode 100644 index 00000000..6ac7d035 --- /dev/null +++ b/fuzzing/make-corpus.py @@ -0,0 +1,29 @@ +#!/bin/env python + +import os +import sys + + +def get_samples(input_files): + for file_name in input_files: + if not os.path.isfile(file_name): + raise RuntimeError("Not a file: " + file_name) + with open(file_name, 'r') as input_file: + yield from input_file + + +def process_files(output_folder, input_files): + if not os.path.exists(output_folder): + os.makedirs(output_folder) + + for i, sample in enumerate(get_samples(input_files)): + with open(os.path.join(output_folder, str(i) + ".txt"), 'w') as output_file: + output_file.write(sample) + + +if __name__ == "__main__": + if len(sys.argv) < 3: + print("Usage: python script.py [ ...]") + sys.exit(1) + + process_files(output_folder=sys.argv[1], input_files=sys.argv[2:]) diff --git a/fuzzing/seedcorpus/fuzz_scientific_to_int/scientific_to_int.txt b/fuzzing/seedcorpus/fuzz_scientific_to_int/input.txt similarity index 100% rename from fuzzing/seedcorpus/fuzz_scientific_to_int/scientific_to_int.txt rename to fuzzing/seedcorpus/fuzz_scientific_to_int/input.txt