aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/instance
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2024-04-11 15:06:11 +0200
committerDmitry Vyukov <dvyukov@google.com>2024-04-11 14:27:17 +0000
commit3f7932d24f9b230ac0e3592093a15a5a8c0a3770 (patch)
tree904de8641bddcba7d52263dfb361cdba5faeaa03 /pkg/instance
parentda2de8407550b81caeab72cf2fe645d1705f409e (diff)
vm: combine Run and MonitorExecution
All callers of Run always call MonitorExecution right after it. Combine these 2 methods. This allows to hide some implementation details and simplify users of vm package.
Diffstat (limited to 'pkg/instance')
-rw-r--r--pkg/instance/execprog.go23
-rw-r--r--pkg/instance/instance.go8
2 files changed, 15 insertions, 16 deletions
diff --git a/pkg/instance/execprog.go b/pkg/instance/execprog.go
index 9e97dcd0c..acade5e8e 100644
--- a/pkg/instance/execprog.go
+++ b/pkg/instance/execprog.go
@@ -37,7 +37,8 @@ type ExecProgInstance struct {
}
type RunResult struct {
- vm.ExecutionResult
+ Output []byte
+ Report *report.Report
}
func SetupExecProg(vmInst *vm.Instance, mgrCfg *mgrconfig.Config, reporter *report.Reporter,
@@ -107,25 +108,23 @@ func (inst *ExecProgInstance) runCommand(command string, duration time.Duration)
command = inst.StraceBin + filterCalls + ` -s 100 -x -f ` + command
prefixOutput = []byte(fmt.Sprintf("%s\n\n<...>\n", command))
}
- outc, errc, err := inst.VMInstance.Run(duration, nil, command)
+ opts := []any{inst.ExitCondition}
+ if inst.BeforeContextLen != 0 {
+ opts = append(opts, vm.OutputSize(inst.BeforeContextLen))
+ }
+ output, rep, err := inst.VMInstance.Run(duration, inst.reporter, command, opts...)
if err != nil {
return nil, fmt.Errorf("failed to run command in VM: %w", err)
}
- result := &RunResult{
- ExecutionResult: *inst.VMInstance.MonitorExecutionRaw(outc, errc,
- inst.reporter, inst.ExitCondition, inst.BeforeContextLen),
- }
- if len(prefixOutput) > 0 {
- result.RawOutput = append(prefixOutput, result.RawOutput...)
- }
- if result.Report == nil {
+ if rep == nil {
inst.Logf(2, "program did not crash")
} else {
- if err := inst.reporter.Symbolize(result.Report); err != nil {
+ if err := inst.reporter.Symbolize(rep); err != nil {
inst.Logf(0, "failed to symbolize report: %v", err)
}
- inst.Logf(2, "program crashed: %v", result.Report.Title)
+ inst.Logf(2, "program crashed: %v", rep.Title)
}
+ result := &RunResult{append(prefixOutput, output...), rep}
return result, nil
}
diff --git a/pkg/instance/instance.go b/pkg/instance/instance.go
index 1e4787c94..4c61b1d24 100644
--- a/pkg/instance/instance.go
+++ b/pkg/instance/instance.go
@@ -388,11 +388,11 @@ func (inst *inst) testInstance() error {
cmd := OldFuzzerCmd(fuzzerBin, executorBin, targets.TestOS, inst.cfg.TargetOS, inst.cfg.TargetArch, fwdAddr,
inst.cfg.Sandbox, inst.cfg.SandboxArg, 0, inst.cfg.Cover, true, inst.optionalFlags, inst.cfg.Timeouts.Slowdown)
- outc, errc, err := inst.vm.Run(10*time.Minute*inst.cfg.Timeouts.Scale, nil, cmd)
+ timeout := 10 * time.Minute * inst.cfg.Timeouts.Scale
+ _, rep, err := inst.vm.Run(timeout, inst.reporter, cmd)
if err != nil {
return fmt.Errorf("failed to run binary in VM: %w", err)
}
- rep := inst.vm.MonitorExecution(outc, errc, inst.reporter, vm.ExitNormal)
if rep != nil {
if err := inst.reporter.Symbolize(rep); err != nil {
// TODO(dvyukov): send such errors to dashboard.
@@ -424,9 +424,9 @@ func (inst *inst) testRepro() ([]byte, error) {
return nil, err
}
if res != nil && res.Report != nil {
- return res.RawOutput, &CrashError{Report: res.Report}
+ return res.Output, &CrashError{Report: res.Report}
}
- return res.RawOutput, nil
+ return res.Output, nil
}
out := []byte{}
if len(inst.reproSyz) > 0 {