diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2020-12-30 08:11:26 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2020-12-30 09:07:36 +0100 |
| commit | 482c3234dfb90d2011c56edbaa250aa45f3f08d2 (patch) | |
| tree | 2bcc835805dd6cb6a34125d3d53ba9d80368c68e | |
| parent | 0fa352f2d664766b3115daecc56ab8608986864b (diff) | |
syz-manager: fix machine check sequence
We used to print disabled syscalls before failing due to an error.
This helped to debug "all system calls are disabled" error.
After a recent change we fail before printing disabled syscalls,
as the result manager just prints "all system calls are disabled"
and fails. Restore the check sequence.
| -rw-r--r-- | syz-manager/manager.go | 17 | ||||
| -rw-r--r-- | syz-manager/rpc.go | 23 |
2 files changed, 21 insertions, 19 deletions
diff --git a/syz-manager/manager.go b/syz-manager/manager.go index 783f0425e..47897d89b 100644 --- a/syz-manager/manager.go +++ b/syz-manager/manager.go @@ -1061,23 +1061,6 @@ func (mgr *Manager) fuzzerConnect() ([]rpctype.RPCInput, BugFrames, bool) { func (mgr *Manager) machineChecked(a *rpctype.CheckArgs, enabledSyscalls map[*prog.Syscall]bool) { mgr.mu.Lock() defer mgr.mu.Unlock() - if len(mgr.cfg.EnabledSyscalls) != 0 && len(a.DisabledCalls[mgr.cfg.Sandbox]) != 0 { - disabled := make(map[string]string) - for _, dc := range a.DisabledCalls[mgr.cfg.Sandbox] { - disabled[mgr.target.Syscalls[dc.ID].Name] = dc.Reason - } - for _, id := range mgr.cfg.Syscalls { - name := mgr.target.Syscalls[id].Name - if reason := disabled[name]; reason != "" { - log.Logf(0, "disabling %v: %v", name, reason) - } - } - } - log.Logf(0, "machine check:") - log.Logf(0, "%-24v: %v/%v", "syscalls", len(enabledSyscalls), len(mgr.target.Syscalls)) - for _, feat := range a.Features.Supported() { - log.Logf(0, "%-24v: %v", feat.Name, feat.Reason) - } mgr.checkResult = a mgr.targetEnabledSyscalls = enabledSyscalls mgr.loadCorpus() diff --git a/syz-manager/rpc.go b/syz-manager/rpc.go index 7ea1c5a23..a42782175 100644 --- a/syz-manager/rpc.go +++ b/syz-manager/rpc.go @@ -197,7 +197,21 @@ func (serv *RPCServer) Check(a *rpctype.CheckArgs, r *int) error { defer serv.mu.Unlock() if serv.checkResult != nil { - return nil + return nil // another VM has already made the check + } + // Note: need to print disbled syscalls before failing due to an error. + // This helps to debug "all system calls are disabled". + if len(serv.cfg.EnabledSyscalls) != 0 && len(a.DisabledCalls[serv.cfg.Sandbox]) != 0 { + disabled := make(map[string]string) + for _, dc := range a.DisabledCalls[serv.cfg.Sandbox] { + disabled[serv.cfg.Target.Syscalls[dc.ID].Name] = dc.Reason + } + for _, id := range serv.cfg.Syscalls { + name := serv.cfg.Target.Syscalls[id].Name + if reason := disabled[name]; reason != "" { + log.Logf(0, "disabling %v: %v", name, reason) + } + } } if a.Error != "" { log.Logf(0, "machine check failed: %v", a.Error) @@ -205,12 +219,17 @@ func (serv *RPCServer) Check(a *rpctype.CheckArgs, r *int) error { if serv.checkFailures == 10 { log.Fatalf("machine check failing") } - return fmt.Errorf("you failed") + return fmt.Errorf("machine check failed: %v", a.Error) } serv.targetEnabledSyscalls = make(map[*prog.Syscall]bool) for _, call := range a.EnabledCalls[serv.cfg.Sandbox] { serv.targetEnabledSyscalls[serv.cfg.Target.Syscalls[call]] = true } + log.Logf(0, "machine check:") + log.Logf(0, "%-24v: %v/%v", "syscalls", len(serv.targetEnabledSyscalls), len(serv.cfg.Target.Syscalls)) + for _, feat := range a.Features.Supported() { + log.Logf(0, "%-24v: %v", feat.Name, feat.Reason) + } serv.mgr.machineChecked(a, serv.targetEnabledSyscalls) a.DisabledCalls = nil serv.checkResult = a |
