aboutsummaryrefslogtreecommitdiffstats
path: root/syz-manager
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2024-11-26 12:01:29 +0100
committerDmitry Vyukov <dvyukov@google.com>2024-11-26 11:32:06 +0000
commit5f6d557d4454398c38d85f6774152d5e0a4436d7 (patch)
tree9d5fbc2f1fe2c8ef08c64ff0a4c511ddd41bc3fa /syz-manager
parent7de7a5ecf43a5c41b5170d0cb70cb744fdf9de9f (diff)
pkg/rpcserver: refactoring in preparation for dynamic interface extraction
Few assorted changes to reduce future diffs: - add rpcserver.RemoteConfig similar to LocalConfig (there are too many parameters) - add CheckGlobs to requesting additional globs from VMs - pass whole InfoRequest to the MachineChecked callback so that it's possible to read globs information - add per-mode config checking in the manager - add Manager.saveJson helper
Diffstat (limited to 'syz-manager')
-rw-r--r--syz-manager/manager.go37
1 files changed, 27 insertions, 10 deletions
diff --git a/syz-manager/manager.go b/syz-manager/manager.go
index 4feb3214b..aed721a79 100644
--- a/syz-manager/manager.go
+++ b/syz-manager/manager.go
@@ -118,6 +118,7 @@ type Mode struct {
ExitAfterMachineCheck bool // exit with 0 status when machine check is done
// Exit with non-zero status and save the report to workdir/report.json if any kernel crash happens.
FailOnCrashes bool
+ CheckConfig func(cfg *mgrconfig.Config) error
}
var (
@@ -211,6 +212,11 @@ func main() {
flag.PrintDefaults()
log.Fatalf("unknown mode: %v", *flagMode)
}
+ if mode.CheckConfig != nil {
+ if err := mode.CheckConfig(cfg); err != nil {
+ log.Fatalf("%v mode: %v", mode.Name, err)
+ }
+ }
if !mode.UseDashboard {
cfg.DashboardClient = ""
cfg.HubClient = ""
@@ -273,7 +279,13 @@ func RunManager(mode *Mode, cfg *mgrconfig.Config) {
// Create RPC server for fuzzers.
mgr.servStats = rpcserver.NewStats()
- mgr.serv, err = rpcserver.New(mgr.cfg, mgr, mgr.servStats, *flagDebug)
+ rpcCfg := &rpcserver.RemoteConfig{
+ Config: mgr.cfg,
+ Manager: mgr,
+ Stats: mgr.servStats,
+ Debug: *flagDebug,
+ }
+ mgr.serv, err = rpcserver.New(rpcCfg)
if err != nil {
log.Fatalf("failed to create rpc server: %v", err)
}
@@ -659,13 +671,7 @@ func (mgr *Manager) saveCrash(crash *manager.Crash) bool {
log.Logf(0, "VM %v: crash: %v%v", crash.InstanceIndex, crash.Title, flags)
if mgr.mode.FailOnCrashes {
- data, err := json.Marshal(crash.Report)
- if err != nil {
- log.Fatalf("failed to serialize crash report: %v", err)
- }
- if err := osutil.WriteFile(filepath.Join(mgr.cfg.Workdir, "report.json"), data); err != nil {
- log.Fatal(err)
- }
+ mgr.saveJSON("report.json", crash.Report)
log.Fatalf("kernel crashed in smoke testing mode, exiting")
}
@@ -719,6 +725,16 @@ func (mgr *Manager) saveCrash(crash *manager.Crash) bool {
return mgr.NeedRepro(crash)
}
+func (mgr *Manager) saveJSON(filename string, object any) {
+ data, err := json.MarshalIndent(object, "", "\t")
+ if err != nil {
+ log.Fatalf("failed to serialize json data: %v", err)
+ }
+ if err := osutil.WriteFile(filepath.Join(mgr.cfg.Workdir, filename), data); err != nil {
+ log.Fatal(err)
+ }
+}
+
func (mgr *Manager) needLocalRepro(crash *manager.Crash) bool {
if !mgr.cfg.Reproduce || crash.Corrupted || crash.Suppressed {
return false
@@ -1039,12 +1055,13 @@ func (mgr *Manager) BugFrames() (leaks, races []string) {
return
}
-func (mgr *Manager) MachineChecked(features flatrpc.Feature, enabledSyscalls map[*prog.Syscall]bool) queue.Source {
+func (mgr *Manager) MachineChecked(info *flatrpc.InfoRequest, features flatrpc.Feature,
+ enabledSyscalls map[*prog.Syscall]bool) queue.Source {
if len(enabledSyscalls) == 0 {
log.Fatalf("all system calls are disabled")
}
if mgr.mode.ExitAfterMachineCheck {
- mgr.exit("done")
+ mgr.exit(mgr.mode.Name)
}
mgr.mu.Lock()