aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Konovalov <andreyknvl@google.com>2019-04-10 18:11:44 +0200
committerDmitry Vyukov <dvyukov@google.com>2019-05-31 13:35:25 +0200
commitc054a92ddef28b343db8a733b3e191cf96c28768 (patch)
tree8709cecaf8839ef445a1ad4367ff6ec3dba1fd11
parenta8482b78fba29ae70c98729401928daccd5201e0 (diff)
pkg/csource: generate timeouts for USB syzcalls
This patch only covers per call timeouts, per prog one is not adjusted yet.
-rw-r--r--executor/common.h3
-rw-r--r--executor/executor.cc1
-rw-r--r--pkg/csource/csource.go12
-rw-r--r--pkg/csource/generated.go2
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;
}
}