diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2026-03-11 05:56:50 +0100 |
|---|---|---|
| committer | Aleksandr Nogikh <nogikh@google.com> | 2026-03-11 10:29:00 +0000 |
| commit | e09601ff0fad36b90ec8539f5e3d0fcfc615d42d (patch) | |
| tree | 8d071c8f641281cdde1eb39c482cbe869ff1eac9 /pkg | |
| parent | cf229fb049a95c12f36c391dad739f763f876219 (diff) | |
syz-agent: systematically show verbose error messages
Currently we added custom code to kernel build action,
and few others to expose verbose errors from executed binaries (notably make).
But lots of other binary executions missing this logic,
e.g. for git failure we currently see unuseful:
failed to run ["git" "fetch" "--force" "--tags" exit status 128
Instead of adding more and more custom code to do the same,
remove the custom code and always add verbose output
in syz-agent and tools/syz-aflow.
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/aflow/action/kernel/build.go | 4 | ||||
| -rw-r--r-- | pkg/aflow/flow/patching/actions.go | 3 | ||||
| -rw-r--r-- | pkg/aflow/tool/grepper/grepper.go | 2 | ||||
| -rw-r--r-- | pkg/osutil/osutil.go | 8 | ||||
| -rw-r--r-- | pkg/osutil/osutil_test.go | 12 |
5 files changed, 24 insertions, 5 deletions
diff --git a/pkg/aflow/action/kernel/build.go b/pkg/aflow/action/kernel/build.go index c10dc7d93..4d37dca86 100644 --- a/pkg/aflow/action/kernel/build.go +++ b/pkg/aflow/action/kernel/build.go @@ -52,8 +52,8 @@ func BuildKernel(buildDir, srcDir, cfg string, cleanup bool) error { "ccache", buildDir, runtime.NumCPU()) const compileCommands = "compile_commands.json" makeArgs = append(makeArgs, "-s", path.Base(image), compileCommands) - if out, err := osutil.RunCmd(time.Hour, srcDir, "make", makeArgs...); err != nil { - return aflow.FlowError(fmt.Errorf("make failed: %w\n%s", err, out)) + if _, err := osutil.RunCmd(time.Hour, srcDir, "make", makeArgs...); err != nil { + return aflow.FlowError(err) } if !cleanup { return nil diff --git a/pkg/aflow/flow/patching/actions.go b/pkg/aflow/flow/patching/actions.go index bea70e978..aced1fbe3 100644 --- a/pkg/aflow/flow/patching/actions.go +++ b/pkg/aflow/flow/patching/actions.go @@ -5,7 +5,6 @@ package patching import ( "errors" - "fmt" "os/exec" "path/filepath" "strings" @@ -137,7 +136,7 @@ func recentCommits(ctx *aflow.Context, args recentCommitsArgs) (recentCommitsRes gitArgs := append([]string{"log", "--format=%s", "--no-merges", "-n", "20", args.KernelCommit}, files...) output, err := osutil.RunCmd(10*time.Minute, kernelRepoDir, "git", gitArgs...) if err != nil { - return aflow.FlowError(fmt.Errorf("%w\n%s", err, output)) + return aflow.FlowError(err) } res.RecentCommits = string(output) return nil diff --git a/pkg/aflow/tool/grepper/grepper.go b/pkg/aflow/tool/grepper/grepper.go index 954508471..99a696781 100644 --- a/pkg/aflow/tool/grepper/grepper.go +++ b/pkg/aflow/tool/grepper/grepper.go @@ -56,7 +56,7 @@ func grepper(ctx *aflow.Context, state state, args args) (results, error) { return results{}, aflow.BadCallError("bad expression: %s", bytes.TrimSpace(output)) } } - return results{}, fmt.Errorf("%w\n%s", err, output) + return results{}, err } // There is a potential DoS by LLM is it searches for ".*", // "kmalloc" would be pretty bad (and useless) too. diff --git a/pkg/osutil/osutil.go b/pkg/osutil/osutil.go index d56682732..3ecd98e6d 100644 --- a/pkg/osutil/osutil.go +++ b/pkg/osutil/osutil.go @@ -125,6 +125,14 @@ func (err *VerboseError) Unwrap() error { return err.Err } +func VerboseMessage(err error) string { + msg := err.Error() + if verr := new(VerboseError); errors.As(err, &verr) { + msg += "\n" + string(verr.Output) + } + return msg +} + func IsDir(name string) bool { fileInfo, err := os.Stat(name) return err == nil && fileInfo.IsDir() diff --git a/pkg/osutil/osutil_test.go b/pkg/osutil/osutil_test.go index d1c066b1f..7cdaa7041 100644 --- a/pkg/osutil/osutil_test.go +++ b/pkg/osutil/osutil_test.go @@ -5,6 +5,7 @@ package osutil import ( "bytes" + "errors" "fmt" "os" "path/filepath" @@ -14,6 +15,7 @@ import ( "time" "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/assert" ) func TestIsExist(t *testing.T) { @@ -198,3 +200,13 @@ func TestDiskUsage(t *testing.T) { } expectUsage(1, 1<<10) } + +func TestVerboseMessage(t *testing.T) { + assert.Equal(t, "error message", VerboseMessage(errors.New("error message"))) + verr := &VerboseError{ + Err: errors.New("verbose error"), + Output: []byte("verbose text"), + } + assert.Equal(t, "verbose error\nverbose text", VerboseMessage(verr)) + assert.Equal(t, "wrapped: verbose error\nverbose text", VerboseMessage(fmt.Errorf("wrapped: %w", verr))) +} |
