aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pkg/bisect/bisect.go2
-rw-r--r--pkg/build/freebsd.go2
-rw-r--r--pkg/cover/report_test.go4
-rw-r--r--pkg/instance/instance.go2
-rw-r--r--pkg/osutil/osutil.go24
-rw-r--r--syz-ci/manager.go2
-rw-r--r--syz-ci/updater.go11
-rw-r--r--syz-cluster/workflow/build-step/main.go4
-rw-r--r--tools/syz-testbuild/testbuild.go2
-rw-r--r--vm/vmimpl/util.go5
-rw-r--r--vm/vmimpl/vmimpl.go2
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}
}