aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-10-28 17:37:53 +0100
committerDmitry Vyukov <dvyukov@google.com>2020-10-29 18:02:20 +0100
commitfc3c67f0292ef665a4d6b68d2cb3a25a793a061f (patch)
treea5a2cfb4c05bbbcf848ee0a543fd6ebe7c8bb86f
parentf24824d3d54060a7d878eeb35c47f85dab84966a (diff)
syz-manager: don't fail on the first machine check error
Machine check may be a bit flaky in some contexts (e.g. due to a random timeout flake). Don't fail everything on the first machine check error. Give it 10 tries.
-rw-r--r--syz-manager/manager.go3
-rw-r--r--syz-manager/rpc.go25
2 files changed, 17 insertions, 11 deletions
diff --git a/syz-manager/manager.go b/syz-manager/manager.go
index bac2a773a..3942e12d5 100644
--- a/syz-manager/manager.go
+++ b/syz-manager/manager.go
@@ -1080,9 +1080,6 @@ func (mgr *Manager) machineChecked(a *rpctype.CheckArgs, enabledSyscalls map[*pr
}
}
}
- if a.Error != "" {
- log.Fatalf("machine check: %v", a.Error)
- }
log.Logf(0, "machine check:")
log.Logf(0, "%-24v: %v/%v", "syscalls", len(enabledSyscalls), len(mgr.target.Syscalls))
for _, feat := range a.Features.Supported() {
diff --git a/syz-manager/rpc.go b/syz-manager/rpc.go
index 3cd3d2d08..add55f031 100644
--- a/syz-manager/rpc.go
+++ b/syz-manager/rpc.go
@@ -27,14 +27,15 @@ type RPCServer struct {
sandbox string
batchSize int
- mu sync.Mutex
- fuzzers map[string]*Fuzzer
- checkResult *rpctype.CheckArgs
- maxSignal signal.Signal
- corpusSignal signal.Signal
- corpusCover cover.Cover
- rotator *prog.Rotator
- rnd *rand.Rand
+ mu sync.Mutex
+ fuzzers map[string]*Fuzzer
+ checkResult *rpctype.CheckArgs
+ maxSignal signal.Signal
+ corpusSignal signal.Signal
+ corpusCover cover.Cover
+ rotator *prog.Rotator
+ rnd *rand.Rand
+ checkFailures int
}
type Fuzzer struct {
@@ -198,6 +199,14 @@ func (serv *RPCServer) Check(a *rpctype.CheckArgs, r *int) error {
if serv.checkResult != nil {
return nil
}
+ if a.Error != "" {
+ log.Logf(0, "machine check failed: %v", a.Error)
+ serv.checkFailures++
+ if serv.checkFailures == 10 {
+ log.Fatalf("machine check failing")
+ }
+ return fmt.Errorf("you failed")
+ }
serv.targetEnabledSyscalls = make(map[*prog.Syscall]bool)
for _, call := range a.EnabledCalls[serv.sandbox] {
serv.targetEnabledSyscalls[serv.target.Syscalls[call]] = true