aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-12-30 08:11:26 +0100
committerDmitry Vyukov <dvyukov@google.com>2020-12-30 09:07:36 +0100
commit482c3234dfb90d2011c56edbaa250aa45f3f08d2 (patch)
tree2bcc835805dd6cb6a34125d3d53ba9d80368c68e
parent0fa352f2d664766b3115daecc56ab8608986864b (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.go17
-rw-r--r--syz-manager/rpc.go23
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