diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2025-09-26 15:24:20 +0200 |
|---|---|---|
| committer | Aleksandr Nogikh <nogikh@google.com> | 2025-10-01 14:41:08 +0000 |
| commit | 12039a0e63377e86fa1b5adc3d327d6e07f23a32 (patch) | |
| tree | 0d622daed4041159362850994ab81d8ce351cbff | |
| parent | db09e5b2322f6dbd902a69405c2142617c6b8715 (diff) | |
pkg/osutil: make VerboseError nest other errors
After this change it fits more naturally into the Go's error
functionality.
| -rw-r--r-- | pkg/bisect/bisect.go | 2 | ||||
| -rw-r--r-- | pkg/build/freebsd.go | 2 | ||||
| -rw-r--r-- | pkg/cover/report_test.go | 4 | ||||
| -rw-r--r-- | pkg/instance/instance.go | 2 | ||||
| -rw-r--r-- | pkg/osutil/osutil.go | 24 | ||||
| -rw-r--r-- | syz-ci/manager.go | 2 | ||||
| -rw-r--r-- | syz-ci/updater.go | 11 | ||||
| -rw-r--r-- | syz-cluster/workflow/build-step/main.go | 4 | ||||
| -rw-r--r-- | tools/syz-testbuild/testbuild.go | 2 | ||||
| -rw-r--r-- | vm/vmimpl/util.go | 5 | ||||
| -rw-r--r-- | vm/vmimpl/vmimpl.go | 2 |
11 files changed, 26 insertions, 34 deletions
diff --git a/pkg/bisect/bisect.go b/pkg/bisect/bisect.go index c4b2ebf50..55a5d44f7 100644 --- a/pkg/bisect/bisect.go +++ b/pkg/bisect/bisect.go @@ -658,7 +658,7 @@ func (env *env) test() (*testResult, error) { var verr *osutil.VerboseError var kerr *build.KernelError if errors.As(err, &verr) { - errInfo += verr.Title + errInfo += verr.Error() env.saveDebugFile(current.Hash, 0, verr.Output) } else if errors.As(err, &kerr) { errInfo += string(kerr.Report) diff --git a/pkg/build/freebsd.go b/pkg/build/freebsd.go index 5de09738a..4b403d587 100644 --- a/pkg/build/freebsd.go +++ b/pkg/build/freebsd.go @@ -54,7 +54,7 @@ options DIAGNOSTIC // because FreeBSD's build doesn't correctly order the two // targets. Its output is useful for debugging though, so // include it here. - return ImageDetails{}, osutil.PrependContext(string(output), err) + return ImageDetails{}, fmt.Errorf("%s: %w", string(output), err) } kernelObjDir := filepath.Join(objPrefix, params.KernelDir, diff --git a/pkg/cover/report_test.go b/pkg/cover/report_test.go index 96b634cc6..c3d3231fb 100644 --- a/pkg/cover/report_test.go +++ b/pkg/cover/report_test.go @@ -11,6 +11,7 @@ import ( "bytes" "encoding/csv" "encoding/json" + "errors" "fmt" "os" "path/filepath" @@ -283,7 +284,8 @@ func buildTestBinary(t *testing.T, target *targets.Target, test *Test, dir strin } if _, err := osutil.RunCmd(time.Hour, "", target.CCompiler, ldflags...); err != nil { // Arm linker in the env image has a bug when linking a clang-produced files. - if regexp.MustCompile(`arm-linux-gnueabi.* assertion fail`).MatchString(err.Error()) { + var vErr *osutil.VerboseError + if errors.As(err, &vErr) && regexp.MustCompile(`arm-linux-gnueabi.* assertion fail`).Match(vErr.Output) { t.Skipf("skipping test, broken arm linker (%v)", err) } t.Fatal(err) diff --git a/pkg/instance/instance.go b/pkg/instance/instance.go index 51802acf9..b4460e3ab 100644 --- a/pkg/instance/instance.go +++ b/pkg/instance/instance.go @@ -568,7 +568,7 @@ func RunSmokeTest(cfg *mgrconfig.Config) (*report.Report, error) { var verboseErr *osutil.VerboseError if errors.As(retErr, &verboseErr) { // Include more details into the report. - prefix := fmt.Sprintf("%s, exit code %d\n\n", verboseErr.Title, verboseErr.ExitCode) + prefix := fmt.Sprintf("%s, exit code %d\n\n", verboseErr, verboseErr.ExitCode) output = append([]byte(prefix), output...) } rep := &report.Report{ diff --git a/pkg/osutil/osutil.go b/pkg/osutil/osutil.go index d16a76cb7..1379e8c23 100644 --- a/pkg/osutil/osutil.go +++ b/pkg/osutil/osutil.go @@ -65,9 +65,9 @@ func Run(timeout time.Duration, cmd *exec.Cmd) ([]byte, error) { err := cmd.Wait() close(done) if err != nil { - text := fmt.Sprintf("failed to run %q: %v", cmd.Args, err) + retErr := fmt.Errorf("failed to run %q: %w", cmd.Args, err) if <-timedout { - text = fmt.Sprintf("timedout after %v %q", timeout, cmd.Args) + retErr = fmt.Errorf("timedout after %v %q", timeout, cmd.Args) } exitCode := cmd.ProcessState.ExitCode() var exitErr *exec.ExitError @@ -77,7 +77,7 @@ func Run(timeout time.Duration, cmd *exec.Cmd) ([]byte, error) { } } return output.Bytes(), &VerboseError{ - Title: text, + Err: retErr, Output: output.Bytes(), ExitCode: exitCode, } @@ -111,27 +111,17 @@ func GraciousCommand(bin string, args ...string) *exec.Cmd { } type VerboseError struct { - Title string + Err error Output []byte ExitCode int } func (err *VerboseError) Error() string { - if len(err.Output) == 0 { - return err.Title - } - return fmt.Sprintf("%v\n%s", err.Title, err.Output) + return err.Err.Error() } -func PrependContext(ctx string, err error) error { - var verboseError *VerboseError - switch { - case errors.As(err, &verboseError): - verboseError.Title = fmt.Sprintf("%v: %v", ctx, verboseError.Title) - return verboseError - default: - return fmt.Errorf("%v: %w", ctx, err) - } +func (err *VerboseError) Unwrap() error { + return err.Err } func IsDir(name string) bool { diff --git a/syz-ci/manager.go b/syz-ci/manager.go index ab1e0820b..4f68f2ca4 100644 --- a/syz-ci/manager.go +++ b/syz-ci/manager.go @@ -401,7 +401,7 @@ func (mgr *Manager) build(kernelCommit *vcs.Commit) error { rep.Output = kernelError.Output rep.Recipients = kernelError.Recipients case errors.As(err, &verboseError): - rep.Report = []byte(verboseError.Title) + rep.Report = []byte(verboseError.Error()) rep.Output = verboseError.Output case errors.As(err, &build.InfraError{}): return err diff --git a/syz-ci/updater.go b/syz-ci/updater.go index 0eb901825..80e5b4db5 100644 --- a/syz-ci/updater.go +++ b/syz-ci/updater.go @@ -257,7 +257,7 @@ func (upd *SyzUpdater) build(commit *vcs.Commit) error { cmd.Dir = upd.syzkallerDir cmd.Env = append([]string{"GOPATH=" + upd.gopathDir}, os.Environ()...) if _, err := osutil.Run(time.Hour, cmd); err != nil { - return osutil.PrependContext("make host failed", err) + return fmt.Errorf("make host failed: %w", err) } for target := range upd.targets { parts := strings.Split(target, "/") @@ -271,7 +271,7 @@ func (upd *SyzUpdater) build(commit *vcs.Commit) error { "TARGETARCH="+parts[2], ) if _, err := osutil.Run(time.Hour, cmd); err != nil { - return osutil.PrependContext("make target failed", err) + return fmt.Errorf("make target failed: %w", err) } } cmd = osutil.Command("go", "test", "-short", "./...") @@ -281,7 +281,7 @@ func (upd *SyzUpdater) build(commit *vcs.Commit) error { "SYZ_DISABLE_SANDBOXING=yes", }, os.Environ()...) if _, err := osutil.Run(time.Hour, cmd); err != nil { - return osutil.PrependContext("testing failed", err) + return fmt.Errorf("testing failed: %w", err) } tagFile := filepath.Join(upd.syzkallerDir, "tag") if err := osutil.WriteFile(tagFile, []byte(commit.Hash)); err != nil { @@ -294,14 +294,11 @@ func (upd *SyzUpdater) build(commit *vcs.Commit) error { } func (upd *SyzUpdater) uploadBuildError(commit *vcs.Commit, buildErr error) { - var title string var output []byte var verbose *osutil.VerboseError + title := buildErr.Error() if errors.As(buildErr, &verbose) { - title = verbose.Title output = verbose.Output - } else { - title = buildErr.Error() } title = "syzkaller: " + title for _, mgrcfg := range upd.cfg.Managers { diff --git a/syz-cluster/workflow/build-step/main.go b/syz-cluster/workflow/build-step/main.go index 0fb89225f..3c24cc09d 100644 --- a/syz-cluster/workflow/build-step/main.go +++ b/syz-cluster/workflow/build-step/main.go @@ -263,8 +263,8 @@ func buildKernel(tracer debugtracer.DebugTracer, req *api.BuildRequest) (*BuildR ret.Finding.Log = kernelError.Output return ret, nil case errors.As(err, &verboseError): - tracer.Log("verbose error: %q / %s", verboseError.Title, verboseError.Output) - ret.Finding.Report = []byte(verboseError.Title) + tracer.Log("verbose error: %s / %s", verboseError, verboseError.Output) + ret.Finding.Report = []byte(verboseError.Error()) ret.Finding.Log = verboseError.Output return ret, nil default: diff --git a/tools/syz-testbuild/testbuild.go b/tools/syz-testbuild/testbuild.go index 76130a848..1fb045df7 100644 --- a/tools/syz-testbuild/testbuild.go +++ b/tools/syz-testbuild/testbuild.go @@ -157,7 +157,7 @@ func test(repo vcs.Repo, bisecter vcs.Bisecter, kernelConfig []byte, env instanc if err != nil { var verr *osutil.VerboseError if errors.As(err, &verr) { - log.Printf("BUILD BROKEN: %v", verr.Title) + log.Printf("BUILD BROKEN: %s", verr) saveLog(com.Hash, 0, verr.Output) } else { log.Printf("BUILD BROKEN: %v", err) diff --git a/vm/vmimpl/util.go b/vm/vmimpl/util.go index 2df514ac6..729e78de6 100644 --- a/vm/vmimpl/util.go +++ b/vm/vmimpl/util.go @@ -57,7 +57,10 @@ func WaitForSSH(timeout time.Duration, opts SSHOptions, OS string, stop chan err log.Logf(0, "ssh failed: %v", err) } if time.Since(startTime) > timeout { - return &osutil.VerboseError{Title: "can't ssh into the instance", Output: []byte(err.Error())} + return &osutil.VerboseError{ + Err: fmt.Errorf("can't ssh into the instance"), + Output: []byte(err.Error()), + } } } } diff --git a/vm/vmimpl/vmimpl.go b/vm/vmimpl/vmimpl.go index 480fb85b5..963c88086 100644 --- a/vm/vmimpl/vmimpl.go +++ b/vm/vmimpl/vmimpl.go @@ -104,7 +104,7 @@ func MakeBootError(err error, output []byte) error { } var verboseError *osutil.VerboseError if errors.As(err, &verboseError) { - return BootError{verboseError.Title, append(verboseError.Output, output...)} + return BootError{verboseError.Error(), append(verboseError.Output, output...)} } return BootError{err.Error(), output} } |
