mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 07:31:57 +00:00
add dedicated runner to libfuzzer, update docker
This commit is contained in:
parent
ebb5d61535
commit
50f068efe9
@ -1,77 +1,11 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import configparser
|
import runner
|
||||||
import logging
|
|
||||||
import os
|
|
||||||
from pathlib import Path
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
DEBUGGER = os.getenv("DEBUGGER", "")
|
|
||||||
FUZZER_ARGS = os.getenv("FUZZER_ARGS", "")
|
|
||||||
|
|
||||||
|
|
||||||
def run_fuzzer(fuzzer: str):
|
|
||||||
logging.info(f"Running fuzzer {fuzzer}...")
|
|
||||||
|
|
||||||
corpus_dir = f"{fuzzer}.in"
|
|
||||||
with Path(corpus_dir) as path:
|
|
||||||
if not path.exists() or not path.is_dir():
|
|
||||||
corpus_dir = ""
|
|
||||||
|
|
||||||
options_file = f"{fuzzer}.options"
|
|
||||||
custom_libfuzzer_options = ""
|
|
||||||
|
|
||||||
with Path(options_file) as path:
|
|
||||||
if path.exists() and path.is_file():
|
|
||||||
parser = configparser.ConfigParser()
|
|
||||||
parser.read(path)
|
|
||||||
|
|
||||||
if parser.has_section("asan"):
|
|
||||||
os.environ["ASAN_OPTIONS"] = (
|
|
||||||
f"{os.environ['ASAN_OPTIONS']}:{':'.join('%s=%s' % (key, value) for key, value in parser['asan'].items())}"
|
|
||||||
)
|
|
||||||
|
|
||||||
if parser.has_section("msan"):
|
|
||||||
os.environ["MSAN_OPTIONS"] = (
|
|
||||||
f"{os.environ['MSAN_OPTIONS']}:{':'.join('%s=%s' % (key, value) for key, value in parser['msan'].items())}"
|
|
||||||
)
|
|
||||||
|
|
||||||
if parser.has_section("ubsan"):
|
|
||||||
os.environ["UBSAN_OPTIONS"] = (
|
|
||||||
f"{os.environ['UBSAN_OPTIONS']}:{':'.join('%s=%s' % (key, value) for key, value in parser['ubsan'].items())}"
|
|
||||||
)
|
|
||||||
|
|
||||||
if parser.has_section("libfuzzer"):
|
|
||||||
custom_libfuzzer_options = " ".join(
|
|
||||||
"-%s=%s" % (key, value)
|
|
||||||
for key, value in parser["libfuzzer"].items()
|
|
||||||
)
|
|
||||||
|
|
||||||
cmd_line = f"{DEBUGGER} ./{fuzzer} {FUZZER_ARGS} {corpus_dir}"
|
|
||||||
if custom_libfuzzer_options:
|
|
||||||
cmd_line += f" {custom_libfuzzer_options}"
|
|
||||||
|
|
||||||
if not "-dict=" in cmd_line and Path(f"{fuzzer}.dict").exists():
|
|
||||||
cmd_line += f" -dict={fuzzer}.dict"
|
|
||||||
|
|
||||||
cmd_line += " < /dev/null"
|
|
||||||
|
|
||||||
logging.info(f"...will execute: {cmd_line}")
|
|
||||||
subprocess.check_call(cmd_line, shell=True)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
logging.basicConfig(level=logging.INFO)
|
runner.run()
|
||||||
|
|
||||||
subprocess.check_call("ls -al", shell=True)
|
|
||||||
|
|
||||||
with Path() as current:
|
|
||||||
for fuzzer in current.iterdir():
|
|
||||||
if (current / fuzzer).is_file() and os.access(current / fuzzer, os.X_OK):
|
|
||||||
run_fuzzer(fuzzer)
|
|
||||||
|
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
@ -275,5 +275,5 @@ def download_fuzzers(
|
|||||||
check_name,
|
check_name,
|
||||||
reports_path,
|
reports_path,
|
||||||
result_path,
|
result_path,
|
||||||
lambda x: x.endswith(("_fuzzer", ".dict", ".options", "_seed_corpus.zip")),
|
lambda x: x.endswith(("_fuzzer", ".dict", ".options", "_seed_corpus.zip", "runner.py")),
|
||||||
)
|
)
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
#!/bin/bash -eu
|
#!/bin/bash -eu
|
||||||
|
|
||||||
|
# copy runner
|
||||||
|
cp $SRC/utils/libfuzzer/runner.py $OUT/
|
||||||
|
|
||||||
# copy fuzzer options and dictionaries
|
# copy fuzzer options and dictionaries
|
||||||
cp $SRC/tests/fuzz/*.dict $OUT/
|
cp $SRC/tests/fuzz/*.dict $OUT/
|
||||||
cp $SRC/tests/fuzz/*.options $OUT/
|
cp $SRC/tests/fuzz/*.options $OUT/
|
||||||
|
80
utils/libfuzzer/runner.py
Normal file
80
utils/libfuzzer/runner.py
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import configparser
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
DEBUGGER = os.getenv("DEBUGGER", "")
|
||||||
|
FUZZER_ARGS = os.getenv("FUZZER_ARGS", "")
|
||||||
|
|
||||||
|
|
||||||
|
def run_fuzzer(fuzzer: str):
|
||||||
|
logging.info(f"Running fuzzer {fuzzer}...")
|
||||||
|
|
||||||
|
corpus_dir = f"{fuzzer}.in"
|
||||||
|
with Path(corpus_dir) as path:
|
||||||
|
if not path.exists() or not path.is_dir():
|
||||||
|
corpus_dir = ""
|
||||||
|
|
||||||
|
options_file = f"{fuzzer}.options"
|
||||||
|
custom_libfuzzer_options = ""
|
||||||
|
fuzzer_arguments = ""
|
||||||
|
|
||||||
|
with Path(options_file) as path:
|
||||||
|
if path.exists() and path.is_file():
|
||||||
|
parser = configparser.ConfigParser()
|
||||||
|
parser.read(path)
|
||||||
|
|
||||||
|
if parser.has_section("asan"):
|
||||||
|
os.environ["ASAN_OPTIONS"] = (
|
||||||
|
f"{os.environ['ASAN_OPTIONS']}:{':'.join('%s=%s' % (key, value) for key, value in parser['asan'].items())}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if parser.has_section("msan"):
|
||||||
|
os.environ["MSAN_OPTIONS"] = (
|
||||||
|
f"{os.environ['MSAN_OPTIONS']}:{':'.join('%s=%s' % (key, value) for key, value in parser['msan'].items())}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if parser.has_section("ubsan"):
|
||||||
|
os.environ["UBSAN_OPTIONS"] = (
|
||||||
|
f"{os.environ['UBSAN_OPTIONS']}:{':'.join('%s=%s' % (key, value) for key, value in parser['ubsan'].items())}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if parser.has_section("libfuzzer"):
|
||||||
|
custom_libfuzzer_options = " ".join(
|
||||||
|
"-%s=%s" % (key, value)
|
||||||
|
for key, value in parser["libfuzzer"].items()
|
||||||
|
)
|
||||||
|
|
||||||
|
if parser.has_section("fuzzer_arguments"):
|
||||||
|
fuzzer_arguments = " ".join(
|
||||||
|
("%s" % key) if value == "" else ("%s=%s" % (key, value))
|
||||||
|
for key, value in parser["fuzzer_arguments"].items()
|
||||||
|
)
|
||||||
|
|
||||||
|
cmd_line = f"{DEBUGGER} ./{fuzzer} {FUZZER_ARGS} {corpus_dir}"
|
||||||
|
if custom_libfuzzer_options:
|
||||||
|
cmd_line += f" {custom_libfuzzer_options}"
|
||||||
|
if fuzzer_arguments:
|
||||||
|
cmd_line += f" {fuzzer_arguments}"
|
||||||
|
|
||||||
|
if not "-dict=" in cmd_line and Path(f"{fuzzer}.dict").exists():
|
||||||
|
cmd_line += f" -dict={fuzzer}.dict"
|
||||||
|
|
||||||
|
cmd_line += " < /dev/null"
|
||||||
|
|
||||||
|
logging.info(f"...will execute: {cmd_line}")
|
||||||
|
subprocess.check_call(cmd_line, shell=True)
|
||||||
|
|
||||||
|
|
||||||
|
def run():
|
||||||
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
|
||||||
|
subprocess.check_call("ls -al", shell=True)
|
||||||
|
|
||||||
|
with Path() as current:
|
||||||
|
for fuzzer in current.iterdir():
|
||||||
|
if (current / fuzzer).is_file() and os.access(current / fuzzer, os.X_OK):
|
||||||
|
run_fuzzer(fuzzer)
|
Loading…
Reference in New Issue
Block a user