mirror of https://github.com/openXC7/prjxray.git
Add retries to run_fuzzer.py
Signed-off-by: Tim 'mithro' Ansell <me@mith.ro>
This commit is contained in:
parent
772c5cad44
commit
fa2bf16acc
|
|
@ -333,51 +333,69 @@ def should_run_submake(make_flags):
|
||||||
|
|
||||||
|
|
||||||
def main(argv):
|
def main(argv):
|
||||||
fuzzers = os.path.abspath(os.path.dirname(__file__))
|
fuzzers_dir = os.path.abspath(os.path.dirname(__file__))
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description=__doc__)
|
parser = argparse.ArgumentParser(description=__doc__)
|
||||||
parser.add_argument("fuzzer", help="fuzzer to run")
|
parser.add_argument("fuzzer", help="fuzzer to run")
|
||||||
|
parser.add_argument(
|
||||||
|
"--retries",
|
||||||
|
type=int,
|
||||||
|
default=5,
|
||||||
|
help="Retry a failed fuzzer n times.",
|
||||||
|
)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
make_cmd = os.environ.get('MAKE', 'make')
|
|
||||||
make_flags = os.environ.get('MAKEFLAGS', '')
|
|
||||||
|
|
||||||
# Should run things?
|
|
||||||
if not should_run_submake(make_flags):
|
|
||||||
return 0
|
|
||||||
|
|
||||||
time_start = datetime.utcnow()
|
|
||||||
|
|
||||||
# Setup the logger with flush=False, it should be safe to use in a signal
|
# Setup the logger with flush=False, it should be safe to use in a signal
|
||||||
# handler.
|
# handler.
|
||||||
fuzzer_length = max(len(f) for f in os.listdir(fuzzers))
|
fuzzer_length = max(len(f) for f in os.listdir(fuzzers_dir))
|
||||||
logger = Logger(args.fuzzer, time_start, fuzzer_length)
|
logger = Logger(args.fuzzer, datetime.utcnow(), fuzzer_length)
|
||||||
|
|
||||||
def log(msg, *a, **k):
|
|
||||||
logger.log(msg, a, k, flush=True)
|
|
||||||
|
|
||||||
# Need a signal handler on SIGCHLD otherwise get_resource doesn't return
|
# Need a signal handler on SIGCHLD otherwise get_resource doesn't return
|
||||||
# anything.
|
# anything.
|
||||||
signal.signal(signal.SIGCHLD, lambda sig, frame: None)
|
signal.signal(signal.SIGCHLD, lambda sig, frame: None)
|
||||||
|
|
||||||
fuzzer_dir = os.path.join(fuzzers, args.fuzzer)
|
fuzzer_dir = os.path.join(fuzzers_dir, args.fuzzer)
|
||||||
assert os.path.exists(fuzzer_dir), fuzzer_dir
|
assert os.path.exists(fuzzer_dir), fuzzer_dir
|
||||||
# FIXME: The fuzzer output directory should be different from the top level
|
|
||||||
# fuzzer directory.
|
|
||||||
fuzzer_logdir = os.path.join(fuzzer_dir, "logs")
|
|
||||||
if not os.path.exists(fuzzer_logdir):
|
|
||||||
os.makedirs(fuzzer_logdir)
|
|
||||||
assert os.path.exists(fuzzer_logdir)
|
|
||||||
|
|
||||||
fuzzer_runok = os.path.join(fuzzer_logdir, "run.ok")
|
exit_code = -1
|
||||||
|
for retry_count in range(0, args.retries):
|
||||||
|
logger.log('Running fuzzer attempt: {}', [retry_count])
|
||||||
|
exit_code = run_fuzzer(args.fuzzer, fuzzer_dir, logger)
|
||||||
|
if exit_code <= 0:
|
||||||
|
break
|
||||||
|
logger.log('WARNING: Fuzzer failed!')
|
||||||
|
return exit_code
|
||||||
|
|
||||||
|
|
||||||
|
def run_fuzzer(fuzzer_name, fuzzer_dir, logger):
|
||||||
|
def log(msg, *a, **k):
|
||||||
|
logger.log(msg, a, k, flush=True)
|
||||||
|
|
||||||
|
make_cmd = os.environ.get('MAKE', 'make')
|
||||||
|
make_flags = os.environ.get('MAKEFLAGS', '')
|
||||||
|
# Should run things?
|
||||||
|
if not should_run_submake(make_flags):
|
||||||
|
return 0
|
||||||
|
|
||||||
|
fuzzer_runok = os.path.join(fuzzer_dir, "run.ok")
|
||||||
if os.path.exists(fuzzer_runok):
|
if os.path.exists(fuzzer_runok):
|
||||||
last_modified = datetime.fromtimestamp(os.stat(fuzzer_runok).st_mtime)
|
last_modified = datetime.fromtimestamp(os.stat(fuzzer_runok).st_mtime)
|
||||||
|
|
||||||
log(
|
log(
|
||||||
"Skipping as run.ok exists (updated @ {})",
|
"Skipping as run.ok exists (updated @ {})",
|
||||||
last_modified.isoformat())
|
last_modified.isoformat())
|
||||||
else:
|
|
||||||
log("Starting @ {}", time_start.isoformat())
|
return 0
|
||||||
|
|
||||||
|
time_start = datetime.utcnow()
|
||||||
|
log("Starting @ {}", time_start.isoformat())
|
||||||
|
|
||||||
|
# FIXME: The fuzzer output directory should be different from the top level
|
||||||
|
# fuzzer directory.
|
||||||
|
fuzzer_logdir = os.path.join(fuzzer_dir, "logs")
|
||||||
|
if not os.path.exists(fuzzer_logdir):
|
||||||
|
os.makedirs(fuzzer_logdir)
|
||||||
|
assert os.path.exists(fuzzer_logdir)
|
||||||
|
|
||||||
running_msg = "Running {} -C {} run (with MAKEFLAGS='{}')".format(
|
running_msg = "Running {} -C {} run (with MAKEFLAGS='{}')".format(
|
||||||
make_cmd,
|
make_cmd,
|
||||||
|
|
@ -462,8 +480,14 @@ def main(argv):
|
||||||
log(tb.getvalue())
|
log(tb.getvalue())
|
||||||
|
|
||||||
# Prevent Ctrl-C so we exit properly...
|
# Prevent Ctrl-C so we exit properly...
|
||||||
signal.signal(signal.SIGINT, lambda sig, frame: logger.log("Dieing!"))
|
old_sigint_handler = signal.getsignal(signal.SIGINT)
|
||||||
|
|
||||||
|
def log_die(sig, frame):
|
||||||
|
logger.log("Dieing!")
|
||||||
|
|
||||||
|
signal.signal(signal.SIGINT, log_die)
|
||||||
|
|
||||||
|
# Cleanup child process if they haven't already died.
|
||||||
try:
|
try:
|
||||||
if p is not None:
|
if p is not None:
|
||||||
try:
|
try:
|
||||||
|
|
@ -517,6 +541,7 @@ Succeeded! @ {}
|
||||||
""", time_end.isoformat(), success_log, time_end.isoformat())
|
""", time_end.isoformat(), success_log, time_end.isoformat())
|
||||||
|
|
||||||
logger.flush()
|
logger.flush()
|
||||||
|
signal.signal(signal.SIGINT, old_sigint_handler)
|
||||||
return retcode
|
return retcode
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue