From c054a92ddef28b343db8a733b3e191cf96c28768 Mon Sep 17 00:00:00 2001 From: Andrey Konovalov Date: Wed, 10 Apr 2019 18:11:44 +0200 Subject: pkg/csource: generate timeouts for USB syzcalls This patch only covers per call timeouts, per prog one is not adjusted yet. --- executor/common.h | 3 ++- executor/executor.cc | 1 + pkg/csource/csource.go | 12 ++++++++++++ pkg/csource/generated.go | 2 +- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/executor/common.h b/executor/common.h index db2e1204e..642b23102 100644 --- a/executor/common.h +++ b/executor/common.h @@ -479,7 +479,7 @@ again: if (collide && (call % 2) == 0) break; #endif - event_timedwait(&th->done, 45); + event_timedwait(&th->done, /*CALL_TIMEOUT*/); break; } } @@ -619,6 +619,7 @@ static void loop(void) executed_calls = now_executed; last_executed = now; } + // TODO: adjust timeout for progs with syz_usb_connect call. if ((now - start < 5 * 1000) && (now - start < 3 * 1000 || now - last_executed < 1000)) continue; #else diff --git a/executor/executor.cc b/executor/executor.cc index 4dfe9490f..df38de3b9 100644 --- a/executor/executor.cc +++ b/executor/executor.cc @@ -593,6 +593,7 @@ retry: if (call_num == instr_eof) break; int call_extra_timeout = 0; + // Must match timeouts in pkg/csource/csource.go. if (strcmp(syscalls[call_num].name, "syz_usb_connect") == 0) { collect_extra_cover = true; prog_extra_timeout = 2000; diff --git a/pkg/csource/csource.go b/pkg/csource/csource.go index 75b5a5e02..de99313d2 100644 --- a/pkg/csource/csource.go +++ b/pkg/csource/csource.go @@ -73,6 +73,18 @@ func Write(p *prog.Prog, opts Options) ([]byte, error) { replacements["SANDBOX_FUNC"] = replacements["SYSCALLS"] replacements["SYSCALLS"] = "unused" } + // Must match timeouts in executor/executor.cc. + specialCallTimeouts := map[string]int{ + "syz_usb_connect": 2000, + "syz_usb_disconnect": 200, + } + timeoutExpr := "45" + for i, call := range p.Calls { + if timeout, ok := specialCallTimeouts[call.Meta.CallName]; ok { + timeoutExpr += fmt.Sprintf(" + (call == %d ? %d : 0)", i, timeout) + } + } + replacements["CALL_TIMEOUT"] = timeoutExpr result, err := createCommonHeader(p, mmapProg, replacements, opts) if err != nil { return nil, err diff --git a/pkg/csource/generated.go b/pkg/csource/generated.go index 6f2a36354..d49ae6039 100644 --- a/pkg/csource/generated.go +++ b/pkg/csource/generated.go @@ -5224,7 +5224,7 @@ again: if (collide && (call % 2) == 0) break; #endif - event_timedwait(&th->done, 45); + event_timedwait(&th->done, /*CALL_TIMEOUT*/); break; } } -- cgit mrf-deployment