aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2024-05-07 17:04:45 +0200
committerDmitry Vyukov <dvyukov@google.com>2024-05-16 15:38:27 +0000
commitb6954dce2f21b8feb1448edaaeeefc22f5ff4944 (patch)
tree6f4358ba6609826b614847707e180662d986f98e /tools
parentf694ecdc179cf43429135188934eed687ae28645 (diff)
pkg/vminfo: run programs interactively
Use the same interfaces as the fuzzer. Now syz-manager no longer needs to treat machine check executions differently.
Diffstat (limited to 'tools')
-rw-r--r--tools/syz-execprog/execprog.go74
1 files changed, 47 insertions, 27 deletions
diff --git a/tools/syz-execprog/execprog.go b/tools/syz-execprog/execprog.go
index 518e7511f..b246c4263 100644
--- a/tools/syz-execprog/execprog.go
+++ b/tools/syz-execprog/execprog.go
@@ -7,6 +7,7 @@ package main
import (
"bytes"
+ "context"
"flag"
"fmt"
"math/rand"
@@ -22,13 +23,13 @@ import (
"github.com/google/syzkaller/pkg/csource"
"github.com/google/syzkaller/pkg/db"
"github.com/google/syzkaller/pkg/flatrpc"
+ "github.com/google/syzkaller/pkg/fuzzer/queue"
"github.com/google/syzkaller/pkg/host"
"github.com/google/syzkaller/pkg/ipc"
"github.com/google/syzkaller/pkg/ipc/ipcconfig"
"github.com/google/syzkaller/pkg/log"
"github.com/google/syzkaller/pkg/mgrconfig"
"github.com/google/syzkaller/pkg/osutil"
- "github.com/google/syzkaller/pkg/rpctype"
"github.com/google/syzkaller/pkg/tool"
"github.com/google/syzkaller/pkg/vminfo"
"github.com/google/syzkaller/prog"
@@ -428,36 +429,17 @@ func createConfig(target *prog.Target, featuresFlags csource.Features, syscalls
},
}
checker := vminfo.New(cfg)
- files, requests := checker.StartCheck()
- fileInfos := host.ReadFiles(files)
+ fileInfos := host.ReadFiles(checker.RequiredFiles())
featureInfos, err := host.SetupFeatures(target, config.Executor, flatrpc.AllFeatures, featuresFlags)
if err != nil {
log.Fatal(err)
}
- env, err := ipc.MakeEnv(config, 0)
- if err != nil {
- log.Fatalf("failed to create ipc env: %v", err)
- }
- defer env.Close()
- var results []rpctype.ExecutionResult
- for _, req := range requests {
- output, info, hanged, err := env.ExecProg(&req.ExecOpts, req.ProgData)
- res := rpctype.ExecutionResult{
- ID: req.ID,
- Output: output,
- }
- if info != nil {
- res.Info = *info
- }
- if err != nil {
- res.Error = err.Error()
- }
- if hanged && err == nil {
- res.Error = "hanged"
- }
- results = append(results, res)
- }
- enabledSyscalls, disabledSyscalls, features, err := checker.FinishCheck(fileInfos, results, featureInfos)
+
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+ go checkerExecutor(ctx, checker, config)
+
+ enabledSyscalls, disabledSyscalls, features, err := checker.Run(fileInfos, featureInfos)
if err != nil {
log.Fatal(err)
}
@@ -476,3 +458,41 @@ func createConfig(target *prog.Target, featuresFlags csource.Features, syscalls
execOpts.EnvFlags |= ipc.FeaturesToFlags(features.Enabled(), featuresFlags)
return config, execOpts, enabledSyscalls, features.Enabled()
}
+
+func checkerExecutor(ctx context.Context, source queue.Source, config *ipc.Config) {
+ env, err := ipc.MakeEnv(config, 0)
+ if err != nil {
+ log.Fatalf("failed to create ipc env: %v", err)
+ }
+ defer env.Close()
+ for {
+ req := source.Next()
+ if req == nil {
+ select {
+ case <-time.After(time.Second / 100):
+ case <-ctx.Done():
+ return
+ }
+ continue
+ }
+ progData, err := req.Prog.SerializeForExec()
+ if err != nil {
+ log.Fatalf("failed to serialize %s: %v", req.Prog.Serialize(), err)
+ }
+ output, info, hanged, err := env.ExecProg(req.ExecOpts, progData)
+ res := &queue.Result{
+ Status: queue.Success,
+ Info: info,
+ Output: output,
+ }
+ if err != nil {
+ res.Status = queue.ExecFailure
+ res.Error = err.Error()
+ }
+ if hanged && err == nil {
+ res.Status = queue.ExecFailure
+ res.Error = "hanged"
+ }
+ req.Done(res)
+ }
+}