From 7549a7e1b57831cf6b08ce4700fc6e53417919f9 Mon Sep 17 00:00:00 2001 From: Taras Madan Date: Fri, 21 Jul 2023 11:54:11 +0200 Subject: all: use special placeholder for errors --- dashboard/app/access.go | 12 ++--- dashboard/app/admin.go | 2 +- dashboard/app/api.go | 90 ++++++++++++++++++------------------- dashboard/app/asset_storage.go | 2 +- dashboard/app/discussion.go | 4 +- dashboard/app/entities.go | 28 ++++++------ dashboard/app/jobs.go | 82 ++++++++++++++++----------------- dashboard/app/kcidb.go | 2 +- dashboard/app/main.go | 14 +++--- dashboard/app/reporting.go | 24 +++++----- dashboard/app/reporting_email.go | 28 ++++++------ dashboard/app/reporting_external.go | 10 ++--- dashboard/app/reporting_lists.go | 4 +- dashboard/app/subsystem.go | 2 +- dashboard/app/tree.go | 12 ++--- dashboard/dashapi/dashapi.go | 6 +-- pkg/bisect/bisect.go | 6 +-- pkg/build/akaros.go | 8 ++-- pkg/build/android.go | 26 +++++------ pkg/build/build.go | 4 +- pkg/build/cuttlefish.go | 14 +++--- pkg/build/freebsd.go | 4 +- pkg/build/fuchsia.go | 2 +- pkg/build/linux.go | 14 +++--- pkg/build/linux_linux.go | 14 +++--- pkg/build/netbsd.go | 14 +++--- pkg/build/openbsd.go | 2 +- pkg/config/config.go | 4 +- pkg/cover/backend/dwarf.go | 8 ++-- pkg/cover/backend/elf.go | 4 +- pkg/cover/backend/gvisor.go | 2 +- pkg/cover/backend/mach-o.go | 2 +- pkg/cover/backend/modules.go | 4 +- pkg/cover/html.go | 2 +- pkg/csource/build.go | 2 +- pkg/csource/common.go | 2 +- pkg/csource/csource.go | 4 +- pkg/db/db.go | 14 +++--- pkg/email/parser.go | 16 +++---- pkg/gce/gce.go | 22 ++++----- pkg/gcs/gcs.go | 2 +- pkg/hash/hash.go | 2 +- pkg/host/machine_info_linux.go | 4 +- pkg/ifuzz/x86/gen/gen.go | 8 ++-- pkg/image/compression.go | 6 +-- pkg/instance/execprog.go | 4 +- pkg/instance/instance.go | 24 +++++----- pkg/ipc/ipc.go | 22 ++++----- pkg/ipc/ipc_test.go | 4 +- pkg/kcidb/client.go | 4 +- pkg/kconfig/config.go | 2 +- pkg/kconfig/kconfig.go | 2 +- pkg/mgrconfig/load.go | 2 +- pkg/osutil/fileutil.go | 4 +- pkg/osutil/fileutil_test.go | 2 +- pkg/osutil/osutil.go | 10 ++--- pkg/osutil/osutil_unix.go | 6 +-- pkg/osutil/sharedmem_memfd.go | 2 +- pkg/report/decompile.go | 4 +- pkg/report/report.go | 2 +- pkg/repro/strace.go | 4 +- pkg/rpctype/rpc.go | 2 +- pkg/runtest/run.go | 16 +++---- pkg/symbolizer/nm.go | 4 +- pkg/symbolizer/symbolizer.go | 6 +-- pkg/tool/flags.go | 4 +- pkg/vcs/fuchsia.go | 4 +- pkg/vcs/git.go | 10 ++--- pkg/vcs/linux.go | 2 +- prog/encoding.go | 4 +- prog/validation.go | 2 +- sys/syz-extract/extract.go | 2 +- sys/syz-extract/fetch.go | 8 ++-- sys/syz-extract/freebsd.go | 4 +- sys/syz-extract/linux.go | 8 ++-- sys/syz-extract/netbsd.go | 2 +- sys/syz-extract/openbsd.go | 4 +- syz-ci/jobs.go | 28 ++++++------ syz-ci/manager.go | 38 ++++++++-------- syz-ci/syz-ci.go | 2 +- syz-ci/updater.go | 6 +-- syz-fuzzer/testing.go | 12 ++--- syz-hub/state/state.go | 12 ++--- syz-manager/covfilter.go | 4 +- syz-manager/manager.go | 10 ++--- tools/syz-check/check.go | 2 +- tools/syz-imagegen/imagegen.go | 14 +++--- tools/syz-kconf/kconf.go | 12 ++--- tools/syz-kconf/parser.go | 10 ++--- tools/syz-reporter/reporter.go | 4 +- tools/syz-reprolist/reprolist.go | 6 +-- tools/syz-runtest/runtest.go | 10 ++--- tools/syz-testbed/checkout.go | 4 +- tools/syz-testbed/html.go | 4 +- tools/syz-testbed/instance.go | 8 ++-- tools/syz-testbed/targets.go | 4 +- tools/syz-testbed/testbed.go | 4 +- vm/adb/adb.go | 16 +++---- vm/bhyve/bhyve.go | 2 +- vm/cuttlefish/cuttlefish.go | 22 ++++----- vm/gce/gce.go | 36 +++++++-------- vm/gvisor/gvisor.go | 4 +- vm/isolated/isolated.go | 14 +++--- vm/kvm/kvm.go | 12 ++--- vm/proxyapp/proxyappclient.go | 16 +++---- vm/qemu/qemu.go | 6 +-- vm/starnix/starnix.go | 12 ++--- vm/vm.go | 2 +- vm/vmimpl/console.go | 10 ++--- vm/vmm/vmm.go | 2 +- 110 files changed, 533 insertions(+), 533 deletions(-) diff --git a/dashboard/app/access.go b/dashboard/app/access.go index 7ad85da09..97ed8af01 100644 --- a/dashboard/app/access.go +++ b/dashboard/app/access.go @@ -113,19 +113,19 @@ func checkCrashTextAccess(c context.Context, r *http.Request, field string, id i Filter(field+"=", id). GetAll(c, &crashes) if err != nil { - return nil, nil, fmt.Errorf("failed to query crashes: %v", err) + return nil, nil, fmt.Errorf("failed to query crashes: %w", err) } if len(crashes) != 1 { err := fmt.Errorf("checkCrashTextAccess: found %v crashes for %v=%v", len(crashes), field, id) if len(crashes) == 0 { - err = fmt.Errorf("%w: %v", ErrClientNotFound, err) + err = fmt.Errorf("%w: %w", ErrClientNotFound, err) } return nil, nil, err } crash := crashes[0] bug := new(Bug) if err := db.Get(c, keys[0].Parent(), bug); err != nil { - return nil, nil, fmt.Errorf("failed to get bug: %v", err) + return nil, nil, fmt.Errorf("failed to get bug: %w", err) } bugLevel := bug.sanitizeAccess(accessLevel(c, r)) return bug, crash, checkAccessLevel(c, r, bugLevel) @@ -137,19 +137,19 @@ func checkJobTextAccess(c context.Context, r *http.Request, field string, id int KeysOnly(). GetAll(c, nil) if err != nil { - return fmt.Errorf("failed to query jobs: %v", err) + return fmt.Errorf("failed to query jobs: %w", err) } if len(keys) != 1 { err := fmt.Errorf("checkJobTextAccess: found %v jobs for %v=%v", len(keys), field, id) if len(keys) == 0 { // This can be triggered by bad user requests, so don't log the error. - err = fmt.Errorf("%w: %v", ErrClientNotFound, err) + err = fmt.Errorf("%w: %w", ErrClientNotFound, err) } return err } bug := new(Bug) if err := db.Get(c, keys[0].Parent(), bug); err != nil { - return fmt.Errorf("failed to get bug: %v", err) + return fmt.Errorf("failed to get bug: %w", err) } bugLevel := bug.sanitizeAccess(accessLevel(c, r)) return checkAccessLevel(c, r, bugLevel) diff --git a/dashboard/app/admin.go b/dashboard/app/admin.go index 0b6eef0c6..0bef11da0 100644 --- a/dashboard/app/admin.go +++ b/dashboard/app/admin.go @@ -306,7 +306,7 @@ func updateHeadReproLevel(c context.Context, w http.ResponseWriter, r *http.Requ actual := ReproLevelNone reproCrashes, _, err := queryCrashesForBug(c, key, 2) if err != nil { - return fmt.Errorf("failed to fetch crashes with repro: %v", err) + return fmt.Errorf("failed to fetch crashes with repro: %w", err) } for _, crash := range reproCrashes { if crash.ReproIsRevoked { diff --git a/dashboard/app/api.go b/dashboard/app/api.go index 6565b8690..70b521f73 100644 --- a/dashboard/app/api.go +++ b/dashboard/app/api.go @@ -146,14 +146,14 @@ func handleAPI(c context.Context, r *http.Request) (reply interface{}, err error if str := r.PostFormValue("payload"); str != "" { gr, err := gzip.NewReader(strings.NewReader(str)) if err != nil { - return nil, fmt.Errorf("failed to ungzip payload: %v", err) + return nil, fmt.Errorf("failed to ungzip payload: %w", err) } payload, err = io.ReadAll(gr) if err != nil { - return nil, fmt.Errorf("failed to ungzip payload: %v", err) + return nil, fmt.Errorf("failed to ungzip payload: %w", err) } if err := gr.Close(); err != nil { - return nil, fmt.Errorf("failed to ungzip payload: %v", err) + return nil, fmt.Errorf("failed to ungzip payload: %w", err) } } handler := apiHandlers[method] @@ -173,7 +173,7 @@ func handleAPI(c context.Context, r *http.Request) (reply interface{}, err error func apiLogError(c context.Context, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.LogEntry) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } log.Errorf(c, "%v: %v", req.Name, req.Text) return nil, nil @@ -182,7 +182,7 @@ func apiLogError(c context.Context, r *http.Request, payload []byte) (interface{ func apiBuilderPoll(c context.Context, ns string, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.BuilderPollReq) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } bugs, _, err := loadAllBugs(c, func(query *db.Query) *db.Query { return query.Filter("Namespace=", ns). @@ -249,7 +249,7 @@ func apiCommitPoll(c context.Context, ns string, r *http.Request, payload []byte Limit(100). GetAll(c, &bugs) if err != nil { - return nil, fmt.Errorf("failed to query bugs: %v", err) + return nil, fmt.Errorf("failed to query bugs: %w", err) } commits := make(map[string]bool) for _, bug := range bugs { @@ -266,7 +266,7 @@ func apiCommitPoll(c context.Context, ns string, r *http.Request, payload []byte func apiUploadCommits(c context.Context, ns string, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.CommitPollResultReq) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } // This adds fixing commits to bugs. err := addCommitsToBugs(c, ns, "", nil, req.Commits) @@ -292,7 +292,7 @@ func addCommitInfo(c context.Context, ns string, com dashapi.Commit) error { Filter("Commits=", com.Title). GetAll(c, &bugs) if err != nil { - return fmt.Errorf("failed to query bugs: %v", err) + return fmt.Errorf("failed to query bugs: %w", err) } for i, bug := range bugs { if err := addCommitInfoToBug(c, bug, keys[i], com); err != nil { @@ -311,7 +311,7 @@ func addCommitInfoToBug(c context.Context, bug *Bug, bugKey *db.Key, com dashapi tx := func(c context.Context) error { bug := new(Bug) if err := db.Get(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to get bug %v: %v", bugKey.StringID(), err) + return fmt.Errorf("failed to get bug %v: %w", bugKey.StringID(), err) } if needUpdate, err := addCommitInfoToBugImpl(c, bug, com); err != nil { return err @@ -319,7 +319,7 @@ func addCommitInfoToBug(c context.Context, bug *Bug, bugKey *db.Key, com dashapi return nil } if _, err := db.Put(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to put bug: %v", err) + return fmt.Errorf("failed to put bug: %w", err) } return nil } @@ -365,7 +365,7 @@ func addCommitInfoToBugImpl(c context.Context, bug *Bug, com dashapi.Commit) (bo func apiJobPoll(c context.Context, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.JobPollReq) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } if len(req.Managers) == 0 { return nil, fmt.Errorf("no managers") @@ -377,7 +377,7 @@ func apiJobPoll(c context.Context, r *http.Request, payload []byte) (interface{} func apiJobDone(c context.Context, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.JobDoneReq) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } err := doneJob(c, req) return nil, err @@ -387,7 +387,7 @@ func apiJobDone(c context.Context, r *http.Request, payload []byte) (interface{} func apiJobReset(c context.Context, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.JobResetReq) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } err := resetJobs(c, req) return nil, err @@ -396,7 +396,7 @@ func apiJobReset(c context.Context, r *http.Request, payload []byte) (interface{ func apiUploadBuild(c context.Context, ns string, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.Build) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } now := timeNow(c) _, isNewBuild, err := uploadBuild(c, now, ns, req, BuildNormal) @@ -591,7 +591,7 @@ func addCommitsToBug(c context.Context, bug *Bug, manager string, managers, fixC tx := func(c context.Context) error { bug := new(Bug) if err := db.Get(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to get bug %v: %v", bugKey.StringID(), err) + return fmt.Errorf("failed to get bug %v: %w", bugKey.StringID(), err) } if !bugNeedsCommitUpdate(c, bug, manager, fixCommits, presentCommits, false) { return nil @@ -616,7 +616,7 @@ func addCommitsToBug(c context.Context, bug *Bug, manager string, managers, fixC } } if _, err := db.Put(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to put bug: %v", err) + return fmt.Errorf("failed to put bug: %w", err) } return nil } @@ -650,7 +650,7 @@ func managerList(c context.Context, ns string) ([]string, error) { Distinct(). GetAll(c, &builds) if err != nil { - return nil, fmt.Errorf("failed to query builds: %v", err) + return nil, fmt.Errorf("failed to query builds: %w", err) } configManagers := config.Namespaces[ns].Managers var managers []string @@ -666,7 +666,7 @@ func managerList(c context.Context, ns string) ([]string, error) { func apiReportBuildError(c context.Context, ns string, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.BuildErrorReq) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } now := timeNow(c) build, _, err := uploadBuild(c, now, ns, &req.Build, BuildFailed) @@ -700,7 +700,7 @@ const ( func apiReportCrash(c context.Context, ns string, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.Crash) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } build, err := loadBuild(c, ns, req.BuildID) if err != nil { @@ -787,7 +787,7 @@ func reportCrash(c context.Context, build *Build, req *dashapi.Crash) (*Bug, err tx := func(c context.Context) error { bug = new(Bug) if err := db.Get(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to get bug: %v", err) + return fmt.Errorf("failed to get bug: %w", err) } bug.LastTime = now if save { @@ -816,7 +816,7 @@ func reportCrash(c context.Context, build *Build, req *dashapi.Crash) (*Bug, err bug.MergedTitles = mergeString(bug.MergedTitles, req.Title) bug.AltTitles = mergeStringList(bug.AltTitles, req.AltTitles) if _, err = db.Put(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to put bug: %v", err) + return fmt.Errorf("failed to put bug: %w", err) } return nil } @@ -897,7 +897,7 @@ func saveCrash(c context.Context, ns string, req *dashapi.Crash, bug *Bug, bugKe crash.UpdateReportingPriority(c, build, bug) crashKey := db.NewIncompleteKey(c, "Crash", bugKey) if _, err = db.Put(c, crashKey, crash); err != nil { - return fmt.Errorf("failed to put crash: %v", err) + return fmt.Errorf("failed to put crash: %w", err) } return nil } @@ -983,7 +983,7 @@ func purgeOldCrashes(c context.Context, bug *Bug, bugKey *db.Key) { func apiReportFailedRepro(c context.Context, ns string, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.CrashID) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } req.Title = canonicalizeCrashTitle(req.Title, req.Corrupted, req.Suppressed) @@ -999,12 +999,12 @@ func apiReportFailedRepro(c context.Context, ns string, r *http.Request, payload tx := func(c context.Context) error { bug := new(Bug) if err := db.Get(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to get bug: %v", err) + return fmt.Errorf("failed to get bug: %w", err) } bug.NumRepro++ bug.LastReproTime = now if _, err := db.Put(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to put bug: %v", err) + return fmt.Errorf("failed to put bug: %w", err) } return nil } @@ -1018,7 +1018,7 @@ func apiReportFailedRepro(c context.Context, ns string, r *http.Request, payload func apiNeedRepro(c context.Context, ns string, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.CrashID) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } if req.Corrupted { resp := &dashapi.NeedReproResp{ @@ -1070,7 +1070,7 @@ func normalizeCrashTitle(title string) string { func apiManagerStats(c context.Context, ns string, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.ManagerStatsReq) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } now := timeNow(c) err := updateManager(c, ns, req.Name, func(mgr *Manager, stats *ManagerStats) error { @@ -1104,7 +1104,7 @@ func apiBugList(c context.Context, ns string, r *http.Request, payload []byte) ( KeysOnly(). GetAll(c, nil) if err != nil { - return nil, fmt.Errorf("failed to query bugs: %v", err) + return nil, fmt.Errorf("failed to query bugs: %w", err) } resp := &dashapi.BugListResp{} for _, key := range keys { @@ -1116,12 +1116,12 @@ func apiBugList(c context.Context, ns string, r *http.Request, payload []byte) ( func apiUpdateReport(c context.Context, ns string, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.UpdateReportReq) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } bug := new(Bug) bugKey := db.NewKey(c, "Bug", req.BugID, 0, nil) if err := db.Get(c, bugKey, bug); err != nil { - return nil, fmt.Errorf("failed to get bug: %v", err) + return nil, fmt.Errorf("failed to get bug: %w", err) } if bug.Namespace != ns { return nil, fmt.Errorf("no such bug") @@ -1130,13 +1130,13 @@ func apiUpdateReport(c context.Context, ns string, r *http.Request, payload []by crash := new(Crash) crashKey := db.NewKey(c, "Crash", "", req.CrashID, bugKey) if err := db.Get(c, crashKey, crash); err != nil { - return fmt.Errorf("failed to query the crash: %v", err) + return fmt.Errorf("failed to query the crash: %w", err) } if req.GuiltyFiles != nil { crash.ReportElements.GuiltyFiles = *req.GuiltyFiles } if _, err := db.Put(c, crashKey, crash); err != nil { - return fmt.Errorf("failed to put reported crash: %v", err) + return fmt.Errorf("failed to put reported crash: %w", err) } return nil } @@ -1146,12 +1146,12 @@ func apiUpdateReport(c context.Context, ns string, r *http.Request, payload []by func apiLoadBug(c context.Context, ns string, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.LoadBugReq) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } bug := new(Bug) bugKey := db.NewKey(c, "Bug", req.ID, 0, nil) if err := db.Get(c, bugKey, bug); err != nil { - return nil, fmt.Errorf("failed to get bug: %v", err) + return nil, fmt.Errorf("failed to get bug: %w", err) } if bug.Namespace != ns { return nil, fmt.Errorf("no such bug") @@ -1162,7 +1162,7 @@ func apiLoadBug(c context.Context, ns string, r *http.Request, payload []byte) ( func apiLoadFullBug(c context.Context, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.LoadFullBugReq) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } bug, bugKey, err := findBugByReportingID(c, req.BugID) if err != nil { @@ -1192,7 +1192,7 @@ func loadBugReport(c context.Context, bug *Bug) (*dashapi.BugReport, error) { func apiAddBuildAssets(c context.Context, ns string, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.AddBuildAssetsReq) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } assets := []Asset{} for i, toAdd := range req.Assets { @@ -1237,7 +1237,7 @@ func findExistingBugForCrash(c context.Context, ns string, titles []string) (*Bu Filter("MergedTitles=", titles[0]). GetAll(c, &bugs) if err != nil { - return nil, fmt.Errorf("failed to query bugs: %v", err) + return nil, fmt.Errorf("failed to query bugs: %w", err) } // We can find bugs with different bug.Title and uncomparable bug.Seq's. // But there should be only one active bug for each crash title, @@ -1263,7 +1263,7 @@ func findExistingBugForCrash(c context.Context, ns string, titles []string) (*Bu Limit(1). GetAll(c, &bugs) if err != nil { - return nil, fmt.Errorf("failed to query bugs: %v", err) + return nil, fmt.Errorf("failed to query bugs: %w", err) } if len(bugs) != 0 { bug := bugs[0] @@ -1292,7 +1292,7 @@ func findBugForCrash(c context.Context, ns string, titles []string) (*Bug, error Filter("AltTitles=", title). GetAll(c, &bugs1) if err != nil { - return nil, fmt.Errorf("failed to query bugs: %v", err) + return nil, fmt.Errorf("failed to query bugs: %w", err) } bugs = append(bugs, bugs1...) } @@ -1347,7 +1347,7 @@ func createBugForCrash(c context.Context, ns string, req *dashapi.Crash) (*Bug, bugKey := db.NewKey(c, "Bug", bugHash, 0, nil) if err := db.Get(c, bugKey, bug); err != nil { if err != db.ErrNoSuchEntity { - return fmt.Errorf("failed to get bug: %v", err) + return fmt.Errorf("failed to get bug: %w", err) } bug = &Bug{ Namespace: ns, @@ -1369,7 +1369,7 @@ func createBugForCrash(c context.Context, ns string, req *dashapi.Crash) (*Bug, return err } if _, err = db.Put(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to put new bug: %v", err) + return fmt.Errorf("failed to put new bug: %w", err) } return nil } @@ -1493,15 +1493,15 @@ func getText(c context.Context, tag string, id int64) ([]byte, string, error) { } text := new(Text) if err := db.Get(c, db.NewKey(c, tag, "", id, nil), text); err != nil { - return nil, "", fmt.Errorf("failed to read text %v: %v", tag, err) + return nil, "", fmt.Errorf("failed to read text %v: %w", tag, err) } d, err := gzip.NewReader(bytes.NewBuffer(text.Text)) if err != nil { - return nil, "", fmt.Errorf("failed to read text %v: %v", tag, err) + return nil, "", fmt.Errorf("failed to read text %v: %w", tag, err) } data, err := io.ReadAll(d) if err != nil { - return nil, "", fmt.Errorf("failed to read text %v: %v", tag, err) + return nil, "", fmt.Errorf("failed to read text %v: %w", tag, err) } return data, text.Namespace, nil } @@ -1576,7 +1576,7 @@ func handleRefreshSubsystems(w http.ResponseWriter, r *http.Request) { func apiSaveDiscussion(c context.Context, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.SaveDiscussionReq) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } d := req.Discussion newBugIDs := []string{} diff --git a/dashboard/app/asset_storage.go b/dashboard/app/asset_storage.go index 10926dfa2..3ce096799 100644 --- a/dashboard/app/asset_storage.go +++ b/dashboard/app/asset_storage.go @@ -442,7 +442,7 @@ func (ad *crashAssetDeprecator) bugStatusPolicy(crashKey *db.Key, crashAsset *As bug := new(Bug) err := db.Get(ad.c, bugKey, bug) if err != nil { - return false, fmt.Errorf("failed to query bug: %s", err) + return false, fmt.Errorf("failed to query bug: %w", err) } return bug.Status == BugStatusOpen || bug.Closed.After(timeNow(ad.c).Add(-keepAssetsForClosedBugs)), nil diff --git a/dashboard/app/discussion.go b/dashboard/app/discussion.go index 12a0392c5..64878f61c 100644 --- a/dashboard/app/discussion.go +++ b/dashboard/app/discussion.go @@ -109,7 +109,7 @@ func mergeDiscussionSummary(c context.Context, key, source string, diff Discussi bug := new(Bug) bugKey := db.NewKey(c, "Bug", key, 0, nil) if err := db.Get(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to get bug: %v", err) + return fmt.Errorf("failed to get bug: %w", err) } var record *BugDiscussionInfo for i, item := range bug.DiscussionInfo { @@ -125,7 +125,7 @@ func mergeDiscussionSummary(c context.Context, key, source string, diff Discussi } record.Summary.merge(diff) if _, err := db.Put(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to put bug: %v", err) + return fmt.Errorf("failed to put bug: %w", err) } return nil } diff --git a/dashboard/app/entities.go b/dashboard/app/entities.go index a4f9dcbe9..812d31e59 100644 --- a/dashboard/app/entities.go +++ b/dashboard/app/entities.go @@ -184,14 +184,14 @@ func updateSingleBug(c context.Context, bugKey *db.Key, transform func(*Bug) err tx := func(c context.Context) error { bug := new(Bug) if err := db.Get(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to get bug: %v", err) + return fmt.Errorf("failed to get bug: %w", err) } err := transform(bug) if err != nil { return err } if _, err := db.Put(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to put bug: %v", err) + return fmt.Errorf("failed to put bug: %w", err) } return nil } @@ -694,7 +694,7 @@ func loadManager(c context.Context, ns, name string) (*Manager, error) { mgr := new(Manager) if err := db.Get(c, mgrKey(c, ns, name), mgr); err != nil { if err != db.ErrNoSuchEntity { - return nil, fmt.Errorf("failed to get manager %v/%v: %v", ns, name, err) + return nil, fmt.Errorf("failed to get manager %v/%v: %w", ns, name, err) } mgr = &Manager{ Namespace: ns, @@ -717,7 +717,7 @@ func updateManager(c context.Context, ns, name string, fn func(mgr *Manager, sta statsKey := db.NewKey(c, "ManagerStats", "", int64(date), mgrKey) if err := db.Get(c, statsKey, stats); err != nil { if err != db.ErrNoSuchEntity { - return fmt.Errorf("failed to get stats %v/%v/%v: %v", ns, name, date, err) + return fmt.Errorf("failed to get stats %v/%v/%v: %w", ns, name, date, err) } stats = &ManagerStats{ Date: date, @@ -729,10 +729,10 @@ func updateManager(c context.Context, ns, name string, fn func(mgr *Manager, sta } if _, err := db.Put(c, mgrKey, mgr); err != nil { - return fmt.Errorf("failed to put manager: %v", err) + return fmt.Errorf("failed to put manager: %w", err) } if _, err := db.Put(c, statsKey, stats); err != nil { - return fmt.Errorf("failed to put manager stats: %v", err) + return fmt.Errorf("failed to put manager stats: %w", err) } return nil } @@ -747,7 +747,7 @@ func loadAllManagers(c context.Context, ns string) ([]*Manager, []*db.Key, error } keys, err := query.GetAll(c, &managers) if err != nil { - return nil, nil, fmt.Errorf("failed to query managers: %v", err) + return nil, nil, fmt.Errorf("failed to query managers: %w", err) } var result []*Manager var resultKeys []*db.Key @@ -775,7 +775,7 @@ func loadBuild(c context.Context, ns, id string) (*Build, error) { if err == db.ErrNoSuchEntity { return nil, fmt.Errorf("unknown build %v/%v", ns, id) } - return nil, fmt.Errorf("failed to get build %v/%v: %v", ns, id, err) + return nil, fmt.Errorf("failed to get build %v/%v: %w", ns, id, err) } return build, nil } @@ -809,7 +809,7 @@ func splitDisplayTitle(display string) (string, int64, error) { seqStr := display[match[4]:match[5]] seq, err := strconv.ParseInt(seqStr, 10, 64) if err != nil { - return "", 0, fmt.Errorf("failed to parse bug title: %v", err) + return "", 0, fmt.Errorf("failed to parse bug title: %w", err) } if seq <= 0 || seq > 1e6 { return "", 0, fmt.Errorf("failed to parse bug title: seq=%v", seq) @@ -825,7 +825,7 @@ func canonicalBug(c context.Context, bug *Bug) (*Bug, error) { canon := new(Bug) bugKey := db.NewKey(c, "Bug", bug.DupOf, 0, nil) if err := db.Get(c, bugKey, canon); err != nil { - return nil, fmt.Errorf("failed to get dup bug %q for %q: %v", + return nil, fmt.Errorf("failed to get dup bug %q for %q: %w", bug.DupOf, bug.keyHash(), err) } bug = canon @@ -949,11 +949,11 @@ func addCrashReference(c context.Context, crashID int64, bugKey *db.Key, ref Cra crash := new(Crash) crashKey := db.NewKey(c, "Crash", "", crashID, bugKey) if err := db.Get(c, crashKey, crash); err != nil { - return fmt.Errorf("failed to get reported crash %v: %v", crashID, err) + return fmt.Errorf("failed to get reported crash %v: %w", crashID, err) } crash.AddReference(ref) if _, err := db.Put(c, crashKey, crash); err != nil { - return fmt.Errorf("failed to put reported crash %v: %v", crashID, err) + return fmt.Errorf("failed to put reported crash %v: %w", crashID, err) } return nil } @@ -963,11 +963,11 @@ func removeCrashReference(c context.Context, crashID int64, bugKey *db.Key, crash := new(Crash) crashKey := db.NewKey(c, "Crash", "", crashID, bugKey) if err := db.Get(c, crashKey, crash); err != nil { - return fmt.Errorf("failed to get reported crash %v: %v", crashID, err) + return fmt.Errorf("failed to get reported crash %v: %w", crashID, err) } crash.ClearReference(t, key) if _, err := db.Put(c, crashKey, crash); err != nil { - return fmt.Errorf("failed to put reported crash %v: %v", crashID, err) + return fmt.Errorf("failed to put reported crash %v: %w", crashID, err) } return nil } diff --git a/dashboard/app/jobs.go b/dashboard/app/jobs.go index 3c31991e2..fc18bab00 100644 --- a/dashboard/app/jobs.go +++ b/dashboard/app/jobs.go @@ -53,7 +53,7 @@ func handleTestRequest(c context.Context, args *testReqArgs) error { } crash, crashKey, err := findCrashForBug(c, args.bug) if err != nil { - return fmt.Errorf("failed to find a crash: %v", err) + return fmt.Errorf("failed to find a crash: %w", err) } _, _, err = addTestJob(c, &testJobArgs{ testReqArgs: *args, @@ -75,7 +75,7 @@ func handleTestRequest(c context.Context, args *testReqArgs) error { merged := email.MergeEmailLists(bugCC, args.jobCC) bugReporting.CC = strings.Join(merged, "|") if _, err := db.Put(c, args.bugKey, bug); err != nil { - return fmt.Errorf("failed to put bug: %v", err) + return fmt.Errorf("failed to put bug: %w", err) } return nil } @@ -163,7 +163,7 @@ func addTestJob(c context.Context, args *testJobArgs) (*Job, *db.Key, error) { Filter("ExtID=", args.extID). GetAll(c, &jobs) if len(jobs) > 1 || err != nil { - return fmt.Errorf("failed to query jobs: jobs=%v err=%v", len(jobs), err) + return fmt.Errorf("failed to query jobs: jobs=%v err=%w", len(jobs), err) } } if len(jobs) != 0 { @@ -175,14 +175,14 @@ func addTestJob(c context.Context, args *testJobArgs) (*Job, *db.Key, error) { } job.Link = args.link if jobKey, err = db.Put(c, jobKey, job); err != nil { - return fmt.Errorf("failed to put job: %v", err) + return fmt.Errorf("failed to put job: %w", err) } return nil } // Create a new job. jobKey = db.NewIncompleteKey(c, "Job", args.bugKey) if jobKey, err = db.Put(c, jobKey, job); err != nil { - return fmt.Errorf("failed to put job: %v", err) + return fmt.Errorf("failed to put job: %w", err) } return addCrashReference(c, job.CrashID, args.bugKey, CrashReference{CrashReferenceJob, extJobID(jobKey), now}) @@ -198,7 +198,7 @@ func addTestJob(c context.Context, args *testJobArgs) (*Job, *db.Key, error) { } } if err != nil { - return nil, nil, fmt.Errorf("job tx failed: %v", err) + return nil, nil, fmt.Errorf("job tx failed: %w", err) } return job, jobKey, nil } @@ -232,7 +232,7 @@ func invalidateBisection(c context.Context, jobKey *db.Key) error { tx := func(c context.Context) error { job := new(Job) if err := db.Get(c, jobKey, job); err != nil { - return fmt.Errorf("failed to get job: %v", err) + return fmt.Errorf("failed to get job: %w", err) } if job.Type != JobBisectCause && job.Type != JobBisectFix { @@ -242,14 +242,14 @@ func invalidateBisection(c context.Context, jobKey *db.Key) error { // Update the job. job.InvalidatedBy = u.Email if _, err := db.Put(c, jobKey, job); err != nil { - return fmt.Errorf("failed to put job: %v", err) + return fmt.Errorf("failed to put job: %w", err) } // Update the bug. bug := new(Bug) bugKey := jobKey.Parent() if err := db.Get(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to get bug: %v", err) + return fmt.Errorf("failed to get bug: %w", err) } if job.Type == JobBisectCause { bug.BisectCause = BisectNot @@ -257,12 +257,12 @@ func invalidateBisection(c context.Context, jobKey *db.Key) error { bug.BisectFix = BisectNot } if _, err := db.Put(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to put bug: %v", err) + return fmt.Errorf("failed to put bug: %w", err) } return nil } if err := db.RunInTransaction(c, tx, &db.TransactionOptions{XG: true, Attempts: 10}); err != nil { - return fmt.Errorf("update failed: %v", err) + return fmt.Errorf("update failed: %w", err) } return nil @@ -363,12 +363,12 @@ func throttleJobGeneration(c context.Context, managers map[string]dashapi.Manage } manager.LastGeneratedJob = timeNow(c) if _, err = db.Put(c, keys[0], manager); err != nil { - return fmt.Errorf("failed to put Manager: %v", err) + return fmt.Errorf("failed to put Manager: %w", err) } return nil } if err := db.RunInTransaction(c, tx, &db.TransactionOptions{}); err != nil { - return fmt.Errorf("failed to throttle: %v", err) + return fmt.Errorf("failed to throttle: %w", err) } } for name := range drop { @@ -624,7 +624,7 @@ func findBugsForBisection(c context.Context, managers map[string]bool, return query }) if err != nil { - return nil, nil, fmt.Errorf("failed to query bugs: %v", err) + return nil, nil, fmt.Errorf("failed to query bugs: %w", err) } for bi, bug := range bugs { if !shouldBisectBug(c, bug, managers, jobType) { @@ -713,7 +713,7 @@ func createBisectJobForBug(c context.Context, bug0 *Bug, crash *Crash, bugKey, c jobKey = nil bug := new(Bug) if err := db.Get(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to get bug %v: %v", bugKey.StringID(), err) + return fmt.Errorf("failed to get bug %v: %w", bugKey.StringID(), err) } if jobType == JobBisectFix && bug.BisectFix != BisectNot || jobType == JobBisectCause && bug.BisectCause != BisectNot { @@ -730,10 +730,10 @@ func createBisectJobForBug(c context.Context, bug0 *Bug, crash *Crash, bugKey, c var err error jobKey = db.NewIncompleteKey(c, "Job", bugKey) if jobKey, err = db.Put(c, jobKey, job); err != nil { - return fmt.Errorf("failed to put job: %v", err) + return fmt.Errorf("failed to put job: %w", err) } if _, err := db.Put(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to put bug: %v", err) + return fmt.Errorf("failed to put bug: %w", err) } return addCrashReference(c, job.CrashID, bugKey, CrashReference{CrashReferenceJob, extJobID(jobKey), now}) @@ -742,7 +742,7 @@ func createBisectJobForBug(c context.Context, bug0 *Bug, crash *Crash, bugKey, c // We're accessing two different kinds in addCrashReference. XG: true, }); err != nil { - return nil, nil, fmt.Errorf("create bisect job tx failed: %v", err) + return nil, nil, fmt.Errorf("create bisect job tx failed: %w", err) } return job, jobKey, nil } @@ -757,7 +757,7 @@ func createJobResp(c context.Context, job *Job, jobKey *db.Key) (*dashapi.JobPol crashKey := db.NewKey(c, "Crash", "", job.CrashID, bugKey) crash := new(Crash) if err := db.Get(c, crashKey, crash); err != nil { - return nil, false, fmt.Errorf("job %v: failed to get crash: %v", jobID, err) + return nil, false, fmt.Errorf("job %v: failed to get crash: %w", jobID, err) } build, err := loadBuild(c, job.Namespace, crash.BuildID) @@ -789,7 +789,7 @@ func createJobResp(c context.Context, job *Job, jobKey *db.Key) (*dashapi.JobPol stale = false job = new(Job) if err := db.Get(c, jobKey, job); err != nil { - return fmt.Errorf("job %v: failed to get in tx: %v", jobID, err) + return fmt.Errorf("job %v: failed to get in tx: %w", jobID, err) } if !job.Finished.IsZero() { // This happens sometimes due to inconsistent db. @@ -800,7 +800,7 @@ func createJobResp(c context.Context, job *Job, jobKey *db.Key) (*dashapi.JobPol job.IsRunning = true job.LastStarted = now if _, err := db.Put(c, jobKey, job); err != nil { - return fmt.Errorf("job %v: failed to put: %v", jobID, err) + return fmt.Errorf("job %v: failed to put: %w", jobID, err) } return nil } @@ -879,11 +879,11 @@ func handleRetestedRepro(c context.Context, now time.Time, job *Job, jobKey *db. } crash.UpdateReportingPriority(c, lastBuild, bug) if _, err := db.Put(c, crashKey, crash); err != nil { - return nil, fmt.Errorf("failed to put crash: %v", err) + return nil, fmt.Errorf("failed to put crash: %w", err) } reproCrashes, crashKeys, err := queryCrashesForBug(c, bugKey, 2) if err != nil { - return nil, fmt.Errorf("failed to fetch crashes with repro: %v", err) + return nil, fmt.Errorf("failed to fetch crashes with repro: %w", err) } // Now we can update the bug. bug.HeadReproLevel = ReproLevelNone @@ -940,7 +940,7 @@ func resetJobs(c context.Context, req *dashapi.JobResetReq) error { tx := func(c context.Context) error { job = new(Job) if err := db.Get(c, jobKey, job); err != nil { - return fmt.Errorf("job %v: failed to get in tx: %v", jobKey, err) + return fmt.Errorf("job %v: failed to get in tx: %w", jobKey, err) } if job.IsFinished() { // Just in case. @@ -948,7 +948,7 @@ func resetJobs(c context.Context, req *dashapi.JobResetReq) error { } job.IsRunning = false if _, err := db.Put(c, jobKey, job); err != nil { - return fmt.Errorf("job %v: failed to put: %v", jobKey, err) + return fmt.Errorf("job %v: failed to put: %w", jobKey, err) } return nil } @@ -971,7 +971,7 @@ func doneJob(c context.Context, req *dashapi.JobDoneReq) error { // So we have to query last build for the manager before the transaction. job := new(Job) if err := db.Get(c, jobKey, job); err != nil { - return fmt.Errorf("job %v: failed to get job: %v", jobID, err) + return fmt.Errorf("job %v: failed to get job: %w", jobID, err) } lastBuild, err := lastManagerBuild(c, job.Namespace, job.Manager) if err != nil { @@ -981,7 +981,7 @@ func doneJob(c context.Context, req *dashapi.JobDoneReq) error { tx := func(c context.Context) error { job = new(Job) if err := db.Get(c, jobKey, job); err != nil { - return fmt.Errorf("job %v: failed to get job: %v", jobID, err) + return fmt.Errorf("job %v: failed to get job: %w", jobID, err) } if !job.Finished.IsZero() { return fmt.Errorf("job %v: already finished", jobID) @@ -1041,11 +1041,11 @@ func doneJob(c context.Context, req *dashapi.JobDoneReq) error { } } if jobKey, err = db.Put(c, jobKey, job); err != nil { - return fmt.Errorf("failed to put job: %v", err) + return fmt.Errorf("failed to put job: %w", err) } if bug != nil { if _, err := db.Put(c, jobKey.Parent(), bug); err != nil { - return fmt.Errorf("failed to put bug: %v", err) + return fmt.Errorf("failed to put bug: %w", err) } } log.Infof(c, "DONE JOB %v: reported=%v reporting=%v", jobID, job.Reported, job.Reporting) @@ -1058,7 +1058,7 @@ func doneJob(c context.Context, req *dashapi.JobDoneReq) error { if job.TreeOrigin { err = treeOriginJobDone(c, jobKey, job) if err != nil { - return fmt.Errorf("job %v: failed to execute tree origin handlers: %s", jobID, err) + return fmt.Errorf("job %v: failed to execute tree origin handlers: %w", jobID, err) } } return nil @@ -1131,7 +1131,7 @@ func pollCompletedJobs(c context.Context, typ string) ([]*dashapi.BugReport, err Filter("Reported=", false). GetAll(c, &jobs) if err != nil { - return nil, fmt.Errorf("failed to query jobs: %v", err) + return nil, fmt.Errorf("failed to query jobs: %w", err) } var reports []*dashapi.BugReport for i, job := range jobs { @@ -1158,7 +1158,7 @@ func pollCompletedJobs(c context.Context, typ string) ([]*dashapi.BugReport, err bug := new(Bug) bugKey := keys[i].Parent() if err := db.Get(c, bugKey, bug); err != nil { - return nil, fmt.Errorf("job %v: failed to get bug: %v", extJobID(keys[i]), err) + return nil, fmt.Errorf("job %v: failed to get bug: %w", extJobID(keys[i]), err) } if len(bug.Commits) != 0 || bug.Status != BugStatusOpen { jobReported(c, extJobID(keys[i])) @@ -1204,11 +1204,11 @@ func createBugReportForJob(c context.Context, job *Job, jobKey *db.Key, config i crashKey := db.NewKey(c, "Crash", "", job.CrashID, bugKey) crash := new(Crash) if err := db.Get(c, crashKey, crash); err != nil { - return nil, fmt.Errorf("failed to get crash: %v", err) + return nil, fmt.Errorf("failed to get crash: %w", err) } bug := new(Bug) if err := db.Get(c, bugKey, bug); err != nil { - return nil, fmt.Errorf("failed to load job parent bug: %v", err) + return nil, fmt.Errorf("failed to load job parent bug: %w", err) } bugReporting := bugReportingByName(bug, job.Reporting) if bugReporting == nil { @@ -1302,7 +1302,7 @@ func jobReported(c context.Context, jobID string) error { tx := func(c context.Context) error { job := new(Job) if err := db.Get(c, jobKey, job); err != nil { - return fmt.Errorf("job %v: failed to get job: %v", jobID, err) + return fmt.Errorf("job %v: failed to get job: %w", jobID, err) } job.Reported = true // Auto-mark the bug as fixed by the result of fix bisection, @@ -1313,17 +1313,17 @@ func jobReported(c context.Context, jobID string) error { bug := new(Bug) bugKey := jobKey.Parent() if err := db.Get(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to get bug: %v", err) + return fmt.Errorf("failed to get bug: %w", err) } if bug.Status == BugStatusOpen && len(bug.Commits) == 0 { bug.updateCommits([]string{job.Commits[0].Title}, now) if _, err := db.Put(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to put bug: %v", err) + return fmt.Errorf("failed to put bug: %w", err) } } } if _, err := db.Put(c, jobKey, job); err != nil { - return fmt.Errorf("failed to put job: %v", err) + return fmt.Errorf("failed to put job: %w", err) } return nil } @@ -1341,7 +1341,7 @@ func handleExternalTestRequest(c context.Context, req *dashapi.TestPatchRequest) } crash, crashKey, err := findCrashForBug(c, bug) if err != nil { - return fmt.Errorf("failed to find a crash: %v", err) + return fmt.Errorf("failed to find a crash: %w", err) } if req.Branch == "" && req.Repo == "" { build, err := loadBuild(c, bug.Namespace, crash.BuildID) @@ -1394,7 +1394,7 @@ func loadPendingJob(c context.Context, managers map[string]dashapi.ManagerJobs) Order("Created"). GetAll(c, &jobs) if err != nil { - return nil, nil, fmt.Errorf("failed to query jobs: %v", err) + return nil, nil, fmt.Errorf("failed to query jobs: %w", err) } sort.Stable(&jobSorter{jobs: jobs, keys: keys}) for i, job := range jobs { @@ -1465,7 +1465,7 @@ func fetchJob(c context.Context, key string) (*Job, *db.Key, error) { } job := new(Job) if err := db.Get(c, jobKey, job); err != nil { - return nil, nil, fmt.Errorf("failed to get job: %v", err) + return nil, nil, fmt.Errorf("failed to get job: %w", err) } return job, jobKey, nil } diff --git a/dashboard/app/kcidb.go b/dashboard/app/kcidb.go index 489c89c3b..b228e771c 100644 --- a/dashboard/app/kcidb.go +++ b/dashboard/app/kcidb.go @@ -91,7 +91,7 @@ func publishKcidbBug(c context.Context, client *kcidb.Client, bug *Bug, bugKey * bug.KcidbStatus = 2 } if _, err := db.Put(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to put bug: %v", err) + return fmt.Errorf("failed to put bug: %w", err) } return nil } diff --git a/dashboard/app/main.go b/dashboard/app/main.go index 8a50192fb..efbfd8ea4 100644 --- a/dashboard/app/main.go +++ b/dashboard/app/main.go @@ -630,7 +630,7 @@ func handleAdmin(c context.Context, w http.ResponseWriter, r *http.Request) erro case "": case "memcache_flush": if err := memcache.Flush(c); err != nil { - return fmt.Errorf("failed to flush memcache: %v", err) + return fmt.Errorf("failed to flush memcache: %w", err) } case "invalidate_bisection": return handleInvalidateBisection(c, w, r) @@ -669,7 +669,7 @@ func handleAdmin(c context.Context, w http.ResponseWriter, r *http.Request) erro if r.FormValue("job_type") != "" { value, err := strconv.Atoi(r.FormValue("job_type")) if err != nil { - return fmt.Errorf("%w: %v", ErrClientBadRequest, err) + return fmt.Errorf("%w: %w", ErrClientBadRequest, err) } g.Go(func() error { var err error @@ -721,7 +721,7 @@ func handleAdmin(c context.Context, w http.ResponseWriter, r *http.Request) erro func handleBug(c context.Context, w http.ResponseWriter, r *http.Request) error { bug, err := findBugByID(c, r) if err != nil { - return fmt.Errorf("%w: %v", ErrClientNotFound, err) + return fmt.Errorf("%w: %w", ErrClientNotFound, err) } accessLevel := accessLevel(c, r) if err := checkAccessLevel(c, r, bug.sanitizeAccess(accessLevel)); err != nil { @@ -1166,14 +1166,14 @@ func handleTextImpl(c context.Context, w http.ResponseWriter, r *http.Request, t if x := r.FormValue("x"); x != "" { xid, err := strconv.ParseUint(x, 16, 64) if err != nil || xid == 0 { - return fmt.Errorf("%w: failed to parse text id: %v", ErrClientBadRequest, err) + return fmt.Errorf("%w: failed to parse text id: %w", ErrClientBadRequest, err) } id = int64(xid) } else { // Old link support, don't remove. xid, err := strconv.ParseInt(r.FormValue("id"), 10, 64) if err != nil || xid == 0 { - return fmt.Errorf("%w: failed to parse text id: %v", ErrClientBadRequest, err) + return fmt.Errorf("%w: failed to parse text id: %w", ErrClientBadRequest, err) } id = xid } @@ -1184,7 +1184,7 @@ func handleTextImpl(c context.Context, w http.ResponseWriter, r *http.Request, t data, ns, err := getText(c, tag, id) if err != nil { if strings.Contains(err.Error(), "datastore: no such entity") { - err = fmt.Errorf("%w: %v", ErrClientBadRequest, err) + err = fmt.Errorf("%w: %w", ErrClientBadRequest, err) } return err } @@ -2058,7 +2058,7 @@ func fetchErrorLogs(c context.Context) ([]byte, error) { adminClient, err := logadmin.NewClient(c, projID) if err != nil { - return nil, fmt.Errorf("failed to create the logging client: %v", err) + return nil, fmt.Errorf("failed to create the logging client: %w", err) } defer adminClient.Close() diff --git a/dashboard/app/reporting.go b/dashboard/app/reporting.go index 609b4cf6e..599eb1a79 100644 --- a/dashboard/app/reporting.go +++ b/dashboard/app/reporting.go @@ -754,7 +754,7 @@ func foreachBug(c context.Context, filter func(*db.Query) *db.Query, fn func(bug break } if err != nil { - return fmt.Errorf("failed to fetch bugs: %v", err) + return fmt.Errorf("failed to fetch bugs: %w", err) } if err := fn(bug, key); err != nil { return err @@ -762,7 +762,7 @@ func foreachBug(c context.Context, filter func(*db.Query) *db.Query, fn func(bug } cur, err := iter.Cursor() if err != nil { - return fmt.Errorf("cursor failed while fetching bugs: %v", err) + return fmt.Errorf("cursor failed while fetching bugs: %w", err) } cursor = &cur } @@ -879,7 +879,7 @@ func checkDupBug(c context.Context, cmd *dashapi.BugUpdate, bug *Bug, bugKey, du *Bug, bool, string, error) { dup := new(Bug) if err := db.Get(c, dupKey, dup); err != nil { - return nil, false, internalError, fmt.Errorf("can't find the dup by key: %v", err) + return nil, false, internalError, fmt.Errorf("can't find the dup by key: %w", err) } bugReporting, _ := bugReportingByID(bug, cmd.ID) dupReporting, _ := bugReportingByID(dup, cmd.DupOf) @@ -906,7 +906,7 @@ func checkDupBug(c context.Context, cmd *dashapi.BugUpdate, bug *Bug, bugKey, du } dupCanon, err := canonicalBug(c, dup) if err != nil { - return nil, false, internalError, fmt.Errorf("failed to get canonical bug for dup: %v", err) + return nil, false, internalError, fmt.Errorf("failed to get canonical bug for dup: %w", err) } if !dupReporting.Closed.IsZero() && dupCanon.Status == BugStatusOpen { return nil, false, "Dup bug is already upstreamed.", nil @@ -956,7 +956,7 @@ func incomingCommandTx(c context.Context, now time.Time, cmd *dashapi.BugUpdate, bool, string, error) { bug := new(Bug) if err := db.Get(c, bugKey, bug); err != nil { - return false, internalError, fmt.Errorf("can't find the corresponding bug: %v", err) + return false, internalError, fmt.Errorf("can't find the corresponding bug: %w", err) } var dup *Bug if cmd.Status == dashapi.BugStatusDup { @@ -975,7 +975,7 @@ func incomingCommandTx(c context.Context, now time.Time, cmd *dashapi.BugUpdate, return ok, reason, err } if _, err := db.Put(c, bugKey, bug); err != nil { - return false, internalError, fmt.Errorf("failed to put bug: %v", err) + return false, internalError, fmt.Errorf("failed to put bug: %w", err) } if err := saveReportingState(c, state); err != nil { return false, internalError, err @@ -1160,7 +1160,7 @@ func findBugByReportingID(c context.Context, id string) (*Bug, *db.Key, error) { Limit(2). GetAll(c, &bugs) if err != nil { - return nil, nil, fmt.Errorf("failed to fetch bugs: %v", err) + return nil, nil, fmt.Errorf("failed to fetch bugs: %w", err) } if len(bugs) == 0 { return nil, nil, fmt.Errorf("failed to find bug by reporting id %q", id) @@ -1183,7 +1183,7 @@ func findDupByTitle(c context.Context, ns, title string) (*Bug, *db.Key, error) if err == db.ErrNoSuchEntity { return nil, nil, nil // This is not really an error, we should notify the user instead. } - return nil, nil, fmt.Errorf("failed to get dup: %v", err) + return nil, nil, fmt.Errorf("failed to get dup: %w", err) } return bug, bugKey, nil } @@ -1299,7 +1299,7 @@ func loadReportingState(c context.Context) (*ReportingState, error) { state := new(ReportingState) key := db.NewKey(c, "ReportingState", "", 1, nil) if err := db.Get(c, key, state); err != nil && err != db.ErrNoSuchEntity { - return nil, fmt.Errorf("failed to get reporting state: %v", err) + return nil, fmt.Errorf("failed to get reporting state: %w", err) } return state, nil } @@ -1307,7 +1307,7 @@ func loadReportingState(c context.Context) (*ReportingState, error) { func saveReportingState(c context.Context, state *ReportingState) error { key := db.NewKey(c, "ReportingState", "", 1, nil) if _, err := db.Put(c, key, state); err != nil { - return fmt.Errorf("failed to put reporting state: %v", err) + return fmt.Errorf("failed to put reporting state: %w", err) } return nil } @@ -1390,7 +1390,7 @@ func loadFullBugInfo(c context.Context, bug *Bug, bugKey *db.Key, for _, crash := range crashes { rep, err := crashBugReport(c, bug, crash.crash, crash.key, bugReporting, reporting) if err != nil { - return nil, fmt.Errorf("crash %d: %e", crash.key.IntID(), err) + return nil, fmt.Errorf("crash %d: %w", crash.key.IntID(), err) } ret.Crashes = append(ret.Crashes, rep) } @@ -1460,7 +1460,7 @@ func representativeCrashes(c context.Context, bugKey *db.Key) ([]*crashWithKey, Limit(1). GetAll(c, &crashes) if err != nil { - return nil, fmt.Errorf("failed to fetch the latest crash: %v", err) + return nil, fmt.Errorf("failed to fetch the latest crash: %w", err) } if len(crashes) > 0 { recentCrash = &crashWithKey{crashes[0], keys[0]} diff --git a/dashboard/app/reporting_email.go b/dashboard/app/reporting_email.go index 071def054..ee87169b7 100644 --- a/dashboard/app/reporting_email.go +++ b/dashboard/app/reporting_email.go @@ -85,11 +85,11 @@ func (cfg *EmailConfig) Type() string { func (cfg *EmailConfig) Validate() error { if _, err := mail.ParseAddress(cfg.Email); err != nil { - return fmt.Errorf("bad email address %q: %v", cfg.Email, err) + return fmt.Errorf("bad email address %q: %w", cfg.Email, err) } for _, email := range cfg.DefaultMaintainers { if _, err := mail.ParseAddress(email); err != nil { - return fmt.Errorf("bad email address %q: %v", email, err) + return fmt.Errorf("bad email address %q: %w", email, err) } } if cfg.MailMaintainers && len(cfg.DefaultMaintainers) == 0 { @@ -150,10 +150,10 @@ func emailPollBugs(c context.Context) error { func emailSendBugReport(c context.Context, rep *dashapi.BugReport) error { cfg := new(EmailConfig) if err := json.Unmarshal(rep.Config, cfg); err != nil { - return fmt.Errorf("failed to unmarshal email config: %v", err) + return fmt.Errorf("failed to unmarshal email config: %w", err) } if err := emailReport(c, rep); err != nil { - return fmt.Errorf("failed to report bug: %v", err) + return fmt.Errorf("failed to report bug: %w", err) } cmd := &dashapi.BugUpdate{ ID: rep.ID, @@ -171,7 +171,7 @@ func emailSendBugReport(c context.Context, rep *dashapi.BugReport) error { } ok, reason, err := incomingCommand(c, cmd) if !ok || err != nil { - return fmt.Errorf("failed to update reported bug: ok=%v reason=%v err=%v", ok, reason, err) + return fmt.Errorf("failed to update reported bug: ok=%v reason=%v err=%w", ok, reason, err) } return nil } @@ -179,7 +179,7 @@ func emailSendBugReport(c context.Context, rep *dashapi.BugReport) error { func emailSendBugListReport(c context.Context, rep *dashapi.BugListReport) error { cfg := new(EmailConfig) if err := json.Unmarshal(rep.Config, cfg); err != nil { - return fmt.Errorf("failed to unmarshal email config: %v", err) + return fmt.Errorf("failed to unmarshal email config: %w", err) } err := emailListReport(c, rep, cfg) if err != nil { @@ -231,7 +231,7 @@ func emailSendBugNotif(c context.Context, notif *dashapi.BugNotification) error case dashapi.BugNotifLabel: bodyBuf := new(bytes.Buffer) if err := mailTemplates.ExecuteTemplate(bodyBuf, "mail_label_notif.txt", notif); err != nil { - return fmt.Errorf("failed to execute mail_label_notif.txt: %v", err) + return fmt.Errorf("failed to execute mail_label_notif.txt: %w", err) } body = bodyBuf.String() default: @@ -239,7 +239,7 @@ func emailSendBugNotif(c context.Context, notif *dashapi.BugNotification) error } cfg := new(EmailConfig) if err := json.Unmarshal(notif.Config, cfg); err != nil { - return fmt.Errorf("failed to unmarshal email config: %v", err) + return fmt.Errorf("failed to unmarshal email config: %w", err) } to := email.MergeEmailLists([]string{cfg.Email}, notif.CC) if cfg.MailMaintainers && notif.Public { @@ -264,7 +264,7 @@ func emailSendBugNotif(c context.Context, notif *dashapi.BugNotification) error } ok, reason, err := incomingCommand(c, cmd) if !ok || err != nil { - return fmt.Errorf("notif update failed: ok=%v reason=%v err=%v", ok, reason, err) + return fmt.Errorf("notif update failed: ok=%v reason=%v err=%w", ok, reason, err) } return nil } @@ -330,7 +330,7 @@ func emailPollJobs(c context.Context) error { func emailReport(c context.Context, rep *dashapi.BugReport) error { cfg := new(EmailConfig) if err := json.Unmarshal(rep.Config, cfg); err != nil { - return fmt.Errorf("failed to unmarshal email config: %v", err) + return fmt.Errorf("failed to unmarshal email config: %w", err) } if rep.UserSpaceArch == targets.AMD64 { // This is default, so don't include the info. @@ -417,7 +417,7 @@ func sendMailTemplate(c context.Context, params *mailSendParams) error { } body := new(bytes.Buffer) if err := mailTemplates.ExecuteTemplate(body, params.templateName, params.templateArg); err != nil { - return fmt.Errorf("failed to execute %v template: %v", params.templateName, err) + return fmt.Errorf("failed to execute %v template: %w", params.templateName, err) } log.Infof(c, "sending email %q to %q", params.title, to) return sendMailText(c, params.cfg, params.title, from, to, params.replyTo, body.String()) @@ -672,7 +672,7 @@ func processDiscussionEmail(c context.Context, msg *email.Email, source dashapi. msg.BugIDs = extIDs err := saveDiscussionMessage(c, msg, source, dType) if err != nil { - return fmt.Errorf("failed to save in discussions: %v", err) + return fmt.Errorf("failed to save in discussions: %w", err) } return nil } @@ -1088,7 +1088,7 @@ func matchBugFromList(c context.Context, sender, subject string) (*bugInfoResult Filter("Title=", title). GetAll(c, &bugs) if err != nil { - return nil, fmt.Errorf("failed to fetch bugs: %v", err) + return nil, fmt.Errorf("failed to fetch bugs: %w", err) } // Filter the bugs by the email. candidates := []*bugInfoResult{} @@ -1237,7 +1237,7 @@ func replyTo(c context.Context, msg *email.Email, bugID, reply string) error { // Sends email, can be stubbed for testing. var sendEmail = func(c context.Context, msg *aemail.Message) error { if err := aemail.Send(c, msg); err != nil { - return fmt.Errorf("failed to send email: %v", err) + return fmt.Errorf("failed to send email: %w", err) } return nil } diff --git a/dashboard/app/reporting_external.go b/dashboard/app/reporting_external.go index cdbcb70be..ffe3f00c8 100644 --- a/dashboard/app/reporting_external.go +++ b/dashboard/app/reporting_external.go @@ -20,7 +20,7 @@ import ( func apiReportingPollBugs(c context.Context, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.PollBugsRequest) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } reports := reportingPollBugs(c, req.Type) resp := &dashapi.PollBugsResponse{ @@ -37,7 +37,7 @@ func apiReportingPollBugs(c context.Context, r *http.Request, payload []byte) (i func apiReportingPollNotifications(c context.Context, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.PollNotificationsRequest) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } notifs := reportingPollNotifications(c, req.Type) resp := &dashapi.PollNotificationsResponse{ @@ -49,7 +49,7 @@ func apiReportingPollNotifications(c context.Context, r *http.Request, payload [ func apiReportingPollClosed(c context.Context, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.PollClosedRequest) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } ids, err := reportingPollClosed(c, req.IDs) if err != nil { @@ -64,7 +64,7 @@ func apiReportingPollClosed(c context.Context, r *http.Request, payload []byte) func apiReportingUpdate(c context.Context, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.BugUpdate) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } if req.JobID != "" { resp := &dashapi.BugUpdateReply{ @@ -89,7 +89,7 @@ func apiReportingUpdate(c context.Context, r *http.Request, payload []byte) (int func apiNewTestJob(c context.Context, r *http.Request, payload []byte) (interface{}, error) { req := new(dashapi.TestPatchRequest) if err := json.Unmarshal(payload, req); err != nil { - return nil, fmt.Errorf("failed to unmarshal request: %v", err) + return nil, fmt.Errorf("failed to unmarshal request: %w", err) } resp := &dashapi.TestPatchReply{} err := handleExternalTestRequest(c, req) diff --git a/dashboard/app/reporting_lists.go b/dashboard/app/reporting_lists.go index 7e9abef81..7e3ff0540 100644 --- a/dashboard/app/reporting_lists.go +++ b/dashboard/app/reporting_lists.go @@ -194,12 +194,12 @@ Please visit the new discussion thread.` dbSubsystem := new(Subsystem) err := db.Get(c, subsystemKey, dbSubsystem) if err != nil { - return fmt.Errorf("failed to get subsystem: %s", err) + return fmt.Errorf("failed to get subsystem: %w", err) } dbSubsystem.LastBugList = time.Time{} _, err = db.Put(c, subsystemKey, dbSubsystem) if err != nil { - return fmt.Errorf("failed to save subsystem: %s", err) + return fmt.Errorf("failed to save subsystem: %w", err) } } _, err = db.Put(c, reportKey, report) diff --git a/dashboard/app/subsystem.go b/dashboard/app/subsystem.go index 5dc0405ca..3777b4ded 100644 --- a/dashboard/app/subsystem.go +++ b/dashboard/app/subsystem.go @@ -81,7 +81,7 @@ func bugsToUpdateSubsystems(c context.Context, ns string, count int) ([]*Bug, [] var tmpBugs []*Bug tmpKeys, err := query.Limit(count).GetAll(c, &tmpBugs) if err != nil { - return nil, nil, fmt.Errorf("query %d failed: %s", i, err) + return nil, nil, fmt.Errorf("query %d failed: %w", i, err) } bugs = append(bugs, tmpBugs...) keys = append(keys, tmpKeys...) diff --git a/dashboard/app/tree.go b/dashboard/app/tree.go index 237f10fe0..e521cfdc8 100644 --- a/dashboard/app/tree.go +++ b/dashboard/app/tree.go @@ -29,7 +29,7 @@ func generateTreeOriginJobs(cGlobal context.Context, bugKey *db.Key, tx := func(c context.Context) error { bug := new(Bug) if err := db.Get(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to get bug: %v", err) + return fmt.Errorf("failed to get bug: %w", err) } ctx := &bugTreeContext{ c: c, @@ -49,7 +49,7 @@ func generateTreeOriginJobs(cGlobal context.Context, bugKey *db.Key, } bug.TreeTests.NeedPoll = false if _, err := db.Put(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to put bug: %v", err) + return fmt.Errorf("failed to put bug: %w", err) } job, jobKey = ctx.job, ctx.jobKey return nil @@ -68,7 +68,7 @@ func treeOriginJobDone(cGlobal context.Context, jobKey *db.Key, job *Job) error tx := func(c context.Context) error { bug := new(Bug) if err := db.Get(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to get bug: %v", err) + return fmt.Errorf("failed to get bug: %w", err) } ctx := &bugTreeContext{ c: c, @@ -88,7 +88,7 @@ func treeOriginJobDone(cGlobal context.Context, jobKey *db.Key, job *Job) error bug.TreeTests.NeedPoll = true } if _, err := db.Put(c, bugKey, bug); err != nil { - return fmt.Errorf("failed to put bug: %v", err) + return fmt.Errorf("failed to put bug: %w", err) } return nil } @@ -542,7 +542,7 @@ func (ctx *bugTreeContext) loadCrashInfo() error { // We need to also tolerate the case when the crash was just deleted. err := db.Get(ctx.c, crashKey, crash) if err != nil && err != db.ErrNoSuchEntity { - return fmt.Errorf("failed to get crash: %v", err) + return fmt.Errorf("failed to get crash: %w", err) } else if err == nil { ok, build, err := ctx.isCrashRelevant(crash) if err != nil { @@ -665,7 +665,7 @@ func treeTestJobs(c context.Context, bug *Bug) ([]*dashapi.JobInfo, error) { crashKey := db.NewKey(c, "Crash", "", job.CrashID, bug.key(c)) crash := new(Crash) if err := db.Get(c, crashKey, crash); err != nil { - return fmt.Errorf("failed to get crash: %v", err) + return fmt.Errorf("failed to get crash: %w", err) } info := makeJobInfo(c, job, jobKey, bug, build, crash) mu.Lock() diff --git a/dashboard/dashapi/dashapi.go b/dashboard/dashapi/dashapi.go index a64ee2ad5..21ba8df1a 100644 --- a/dashboard/dashapi/dashapi.go +++ b/dashboard/dashapi/dashapi.go @@ -945,7 +945,7 @@ func (dash *Dashboard) queryImpl(method string, req, reply interface{}) error { if req != nil { data, err := json.Marshal(req) if err != nil { - return fmt.Errorf("failed to marshal request: %v", err) + return fmt.Errorf("failed to marshal request: %w", err) } buf := new(bytes.Buffer) gz := gzip.NewWriter(buf) @@ -964,7 +964,7 @@ func (dash *Dashboard) queryImpl(method string, req, reply interface{}) error { r.Header.Set("Content-Type", "application/x-www-form-urlencoded") resp, err := dash.doer(r) if err != nil { - return fmt.Errorf("http request failed: %v", err) + return fmt.Errorf("http request failed: %w", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { @@ -973,7 +973,7 @@ func (dash *Dashboard) queryImpl(method string, req, reply interface{}) error { } if reply != nil { if err := json.NewDecoder(resp.Body).Decode(reply); err != nil { - return fmt.Errorf("failed to unmarshal response: %v", err) + return fmt.Errorf("failed to unmarshal response: %w", err) } } return nil diff --git a/pkg/bisect/bisect.go b/pkg/bisect/bisect.go index cd20cca07..4c02e6336 100644 --- a/pkg/bisect/bisect.go +++ b/pkg/bisect/bisect.go @@ -246,7 +246,7 @@ func (env *env) bisect() (*Result, error) { cfg := env.cfg if err := build.Clean(cfg.Manager.TargetOS, cfg.Manager.TargetVMArch, cfg.Manager.Type, cfg.Manager.KernelSrc); err != nil { - return nil, fmt.Errorf("kernel clean failed: %v", err) + return nil, fmt.Errorf("kernel clean failed: %w", err) } env.log("building syzkaller on %v", cfg.Syzkaller.Commit) if _, err := env.inst.BuildSyzkaller(cfg.Syzkaller.Repo, cfg.Syzkaller.Commit); err != nil { @@ -579,7 +579,7 @@ func (env *env) build() (*vcs.Commit, string, error) { buildStart := time.Now() mgr := env.cfg.Manager if err := build.Clean(mgr.TargetOS, mgr.TargetVMArch, mgr.Type, mgr.KernelSrc); err != nil { - return current, "", fmt.Errorf("kernel clean failed: %v", err) + return current, "", fmt.Errorf("kernel clean failed: %w", err) } kern := &env.cfg.Kernel _, imageDetails, err := env.inst.BuildKernel(&instance.BuildKernelConfig{ @@ -618,7 +618,7 @@ func (env *env) test() (*testResult, error) { } if current == nil { // This is not recoverable, as the caller must know which commit to skip. - return res, fmt.Errorf("couldn't get repo HEAD: %v", err) + return res, fmt.Errorf("couldn't get repo HEAD: %w", err) } if err != nil { errInfo := fmt.Sprintf("failed building %v: ", current.Hash) diff --git a/pkg/build/akaros.go b/pkg/build/akaros.go index 9e1ecc66f..67b044f04 100644 --- a/pkg/build/akaros.go +++ b/pkg/build/akaros.go @@ -19,7 +19,7 @@ type akaros struct{} func (ctx akaros) build(params Params) (ImageDetails, error) { configFile := filepath.Join(params.KernelDir, ".config") if err := osutil.WriteFile(configFile, params.Config); err != nil { - return ImageDetails{}, fmt.Errorf("failed to write config file: %v", err) + return ImageDetails{}, fmt.Errorf("failed to write config file: %w", err) } if err := osutil.SandboxChown(configFile); err != nil { return ImageDetails{}, err @@ -61,7 +61,7 @@ bash ` initFile := filepath.Join(params.KernelDir, "kern", "kfs", "init.sh") if err := osutil.WriteFile(initFile, []byte(init)); err != nil { - return ImageDetails{}, fmt.Errorf("failed to write init script: %v", err) + return ImageDetails{}, fmt.Errorf("failed to write init script: %w", err) } if err := osutil.SandboxChown(initFile); err != nil { return ImageDetails{}, err @@ -82,7 +82,7 @@ bash return ImageDetails{}, err } if err := osutil.WriteFile(filepath.Join(params.OutputDir, "image"), nil); err != nil { - return ImageDetails{}, fmt.Errorf("failed to write image file: %v", err) + return ImageDetails{}, fmt.Errorf("failed to write image file: %w", err) } for src, dst := range map[string]string{ ".config": "kernel.config", @@ -93,7 +93,7 @@ bash fullSrc := filepath.Join(params.KernelDir, filepath.FromSlash(src)) fullDst := filepath.Join(params.OutputDir, filepath.FromSlash(dst)) if err := osutil.CopyFile(fullSrc, fullDst); err != nil { - return ImageDetails{}, fmt.Errorf("failed to copy %v: %v", src, err) + return ImageDetails{}, fmt.Errorf("failed to copy %v: %w", src, err) } } return ImageDetails{}, nil diff --git a/pkg/build/android.go b/pkg/build/android.go index bade7142f..13a7de2e6 100644 --- a/pkg/build/android.go +++ b/pkg/build/android.go @@ -86,7 +86,7 @@ func (a android) build(params Params) (ImageDetails, error) { buildCfg.DefconfigFragment), fmt.Sprintf("BUILD_TARGET=%v", buildCfg.BuildTarget)) if _, err := osutil.Run(time.Hour, cmd); err != nil { - return details, fmt.Errorf("failed to build kernel: %s", err) + return details, fmt.Errorf("failed to build kernel: %w", err) } buildDistDir := filepath.Join(params.KernelDir, "dist") @@ -96,30 +96,30 @@ func (a android) build(params Params) (ImageDetails, error) { details.CompilerID, err = a.readCompiler(params.KernelDir) if err != nil { - return details, fmt.Errorf("failed to read compiler: %v", err) + return details, fmt.Errorf("failed to read compiler: %w", err) } if err := osutil.CopyFile(vmlinux, filepath.Join(params.OutputDir, "obj", "vmlinux")); err != nil { - return details, fmt.Errorf("failed to copy vmlinux: %v", err) + return details, fmt.Errorf("failed to copy vmlinux: %w", err) } if err := osutil.CopyFile(config, filepath.Join(params.OutputDir, "obj", "kernel.config")); err != nil { - return details, fmt.Errorf("failed to copy kernel config: %v", err) + return details, fmt.Errorf("failed to copy kernel config: %w", err) } imageFile, err := os.Create(filepath.Join(params.OutputDir, "image")) if err != nil { - return details, fmt.Errorf("failed to create output file: %v", err) + return details, fmt.Errorf("failed to create output file: %w", err) } defer imageFile.Close() if err := a.embedImages(imageFile, buildDistDir, "boot.img", "dtbo.img", buildCfg.VendorBootImage, "vendor_dlkm.img"); err != nil { - return details, fmt.Errorf("failed to embed images: %v", err) + return details, fmt.Errorf("failed to embed images: %w", err) } details.Signature, err = elfBinarySignature(vmlinux, params.Tracer) if err != nil { - return details, fmt.Errorf("failed to generate signature: %s", err) + return details, fmt.Errorf("failed to generate signature: %w", err) } return details, nil @@ -133,7 +133,7 @@ func (a android) embedImages(w io.Writer, srcDir string, imageNames ...string) e path := filepath.Join(srcDir, name) data, err := os.ReadFile(path) if err != nil { - return fmt.Errorf("failed to read %q: %v", name, err) + return fmt.Errorf("failed to read %q: %w", name, err) } if err := tw.WriteHeader(&tar.Header{ @@ -141,16 +141,16 @@ func (a android) embedImages(w io.Writer, srcDir string, imageNames ...string) e Mode: 0600, Size: int64(len(data)), }); err != nil { - return fmt.Errorf("failed to write header for %q: %v", name, err) + return fmt.Errorf("failed to write header for %q: %w", name, err) } if _, err := tw.Write(data); err != nil { - return fmt.Errorf("failed to write data for %q: %v", name, err) + return fmt.Errorf("failed to write data for %q: %w", name, err) } } if err := tw.Close(); err != nil { - return fmt.Errorf("close archive: %v", err) + return fmt.Errorf("close archive: %w", err) } return nil @@ -158,10 +158,10 @@ func (a android) embedImages(w io.Writer, srcDir string, imageNames ...string) e func (a android) clean(kernelDir, targetArch string) error { if err := osutil.RemoveAll(filepath.Join(kernelDir, "out")); err != nil { - return fmt.Errorf("failed to clean 'out' directory: %v", err) + return fmt.Errorf("failed to clean 'out' directory: %w", err) } if err := osutil.RemoveAll(filepath.Join(kernelDir, "dist")); err != nil { - return fmt.Errorf("failed to clean 'dist' directory: %v", err) + return fmt.Errorf("failed to clean 'dist' directory: %w", err) } return nil } diff --git a/pkg/build/build.go b/pkg/build/build.go index f4cee5d88..9bcacbd90 100644 --- a/pkg/build/build.go +++ b/pkg/build/build.go @@ -81,7 +81,7 @@ func Image(params Params) (details ImageDetails, err error) { if len(params.Config) != 0 { // Write kernel config early, so that it's captured on build failures. if err = osutil.WriteFile(filepath.Join(params.OutputDir, "kernel.config"), params.Config); err != nil { - err = fmt.Errorf("failed to write config file: %v", err) + err = fmt.Errorf("failed to write config file: %w", err) return } } @@ -100,7 +100,7 @@ func Image(params Params) (details ImageDetails, err error) { } if key := filepath.Join(params.OutputDir, "key"); osutil.IsExist(key) { if err := os.Chmod(key, 0600); err != nil { - return details, fmt.Errorf("failed to chmod 0600 %v: %v", key, err) + return details, fmt.Errorf("failed to chmod 0600 %v: %w", key, err) } } return diff --git a/pkg/build/cuttlefish.go b/pkg/build/cuttlefish.go index 8580aeba1..377f14222 100644 --- a/pkg/build/cuttlefish.go +++ b/pkg/build/cuttlefish.go @@ -125,7 +125,7 @@ func (c cuttlefish) build(params Params) (ImageDetails, error) { var err error // Clean output directory if it exists. if err := osutil.RemoveAll(filepath.Join(params.KernelDir, "out")); err != nil { - return details, fmt.Errorf("failed to clean before kernel build: %v", err) + return details, fmt.Errorf("failed to clean before kernel build: %w", err) } // Default to build.sh if compiler is not specified. if params.Compiler == "bazel" { @@ -133,25 +133,25 @@ func (c cuttlefish) build(params Params) (ImageDetails, error) { return details, errors.New("kernel config was not provided for build") } if err := c.createDefconfig(filepath.Join(params.KernelDir, "common"), params.Config); err != nil { - return details, fmt.Errorf("failed to create defconfig file: %v", err) + return details, fmt.Errorf("failed to create defconfig file: %w", err) } if err := c.runBazel(params.KernelDir); err != nil { - return details, fmt.Errorf("failed to build kernel: %s", err) + return details, fmt.Errorf("failed to build kernel: %w", err) } // Find the .config file; it is placed in a temporary output directory during the build. cmd := osutil.Command("find", ".", "-regex", ".*virtual_device_x86_64_config.*/\\.config") cmd.Dir = params.KernelDir configBytes, err := osutil.Run(time.Minute, cmd) if err != nil { - return details, fmt.Errorf("failed to find build config: %v", err) + return details, fmt.Errorf("failed to find build config: %w", err) } config = filepath.Join(params.KernelDir, strings.TrimSpace(string(configBytes))) } else { if err := c.runBuild(params.KernelDir, kernelConfig); err != nil { - return details, fmt.Errorf("failed to build kernel: %s", err) + return details, fmt.Errorf("failed to build kernel: %w", err) } if err := c.runBuild(params.KernelDir, moduleConfig); err != nil { - return details, fmt.Errorf("failed to build modules: %s", err) + return details, fmt.Errorf("failed to build modules: %w", err) } config = filepath.Join(params.KernelDir, "out", "common", ".config") } @@ -196,7 +196,7 @@ func (c cuttlefish) build(params Params) (ImageDetails, error) { details.Signature, err = elfBinarySignature(vmlinux, params.Tracer) if err != nil { - return details, fmt.Errorf("failed to generate signature: %s", err) + return details, fmt.Errorf("failed to generate signature: %w", err) } return details, nil diff --git a/pkg/build/freebsd.go b/pkg/build/freebsd.go index c4cae75d0..2f4aa1313 100644 --- a/pkg/build/freebsd.go +++ b/pkg/build/freebsd.go @@ -68,7 +68,7 @@ options DIAGNOSTIC fullSrc := filepath.Join(s.dir, s.src) fullDst := filepath.Join(params.OutputDir, s.dst) if err := osutil.CopyFile(fullSrc, fullDst); err != nil { - return ImageDetails{}, fmt.Errorf("failed to copy %v -> %v: %v", fullSrc, fullDst, err) + return ImageDetails{}, fmt.Errorf("failed to copy %v -> %v: %w", fullSrc, fullDst, err) } } @@ -114,7 +114,7 @@ sudo mdconfig -d -u ${md#md} `, objPrefix, params.KernelDir, confFile) if debugOut, err := osutil.RunCmd(10*time.Minute, params.OutputDir, "/bin/sh", "-c", script); err != nil { - return ImageDetails{}, fmt.Errorf("error copying kernel: %v\n%v", err, debugOut) + return ImageDetails{}, fmt.Errorf("error copying kernel: %w\n%v", err, debugOut) } return ImageDetails{}, nil } diff --git a/pkg/build/fuchsia.go b/pkg/build/fuchsia.go index 22efc3de7..5a7c4fd82 100644 --- a/pkg/build/fuchsia.go +++ b/pkg/build/fuchsia.go @@ -87,7 +87,7 @@ func (fu fuchsia) build(params Params) (ImageDetails, error) { fullSrc := filepath.Join(params.KernelDir, filepath.FromSlash(src)) fullDst := filepath.Join(params.OutputDir, filepath.FromSlash(dst)) if err := osutil.CopyFile(fullSrc, fullDst); err != nil { - return ImageDetails{}, fmt.Errorf("failed to copy %v: %v", src, err) + return ImageDetails{}, fmt.Errorf("failed to copy %v: %w", src, err) } } return ImageDetails{}, nil diff --git a/pkg/build/linux.go b/pkg/build/linux.go index 112e2dfab..4069e0202 100644 --- a/pkg/build/linux.go +++ b/pkg/build/linux.go @@ -70,7 +70,7 @@ func (linux linux) build(params Params) (ImageDetails, error) { func (linux linux) buildKernel(params Params) error { configFile := filepath.Join(params.KernelDir, ".config") if err := linux.writeFile(configFile, params.Config); err != nil { - return fmt.Errorf("failed to write config file: %v", err) + return fmt.Errorf("failed to write config file: %w", err) } // One would expect olddefconfig here, but olddefconfig is not present in v3.6 and below. // oldconfig is the same as olddefconfig if stdin is not set. @@ -107,7 +107,7 @@ func (linux linux) buildKernel(params Params) error { vmlinux := filepath.Join(params.KernelDir, "vmlinux") outputVmlinux := filepath.Join(params.OutputDir, "obj", "vmlinux") if err := osutil.Rename(vmlinux, outputVmlinux); err != nil { - return fmt.Errorf("failed to rename vmlinux: %v", err) + return fmt.Errorf("failed to rename vmlinux: %w", err) } return nil } @@ -120,7 +120,7 @@ func (linux) createImage(params Params, kernelPath string) error { defer os.RemoveAll(tempDir) scriptFile := filepath.Join(tempDir, "create.sh") if err := osutil.WriteExecFile(scriptFile, []byte(createImageScript)); err != nil { - return fmt.Errorf("failed to write script file: %v", err) + return fmt.Errorf("failed to write script file: %w", err) } cmd := osutil.Command(scriptFile, params.UserspaceDir, kernelPath, params.TargetArch) cmd.Dir = tempDir @@ -131,7 +131,7 @@ func (linux) createImage(params Params, kernelPath string) error { "SYZ_SYSCTL_FILE="+osutil.Abs(params.SysctlFile), ) if _, err = osutil.Run(time.Hour, cmd); err != nil { - return fmt.Errorf("image build failed: %v", err) + return fmt.Errorf("image build failed: %w", err) } // Note: we use CopyFile instead of Rename because src and dst can be on different filesystems. imageFile := filepath.Join(params.OutputDir, "image") @@ -254,11 +254,11 @@ func queryLinuxCompiler(kernelDir string) (string, error) { func elfBinarySignature(bin string, tracer debugtracer.DebugTracer) (string, error) { f, err := os.Open(bin) if err != nil { - return "", fmt.Errorf("failed to open binary for signature: %v", err) + return "", fmt.Errorf("failed to open binary for signature: %w", err) } ef, err := elf.NewFile(f) if err != nil { - return "", fmt.Errorf("failed to open elf binary: %v", err) + return "", fmt.Errorf("failed to open elf binary: %w", err) } hasher := sha256.New() for _, sec := range ef.Sections { @@ -272,7 +272,7 @@ func elfBinarySignature(bin string, tracer debugtracer.DebugTracer) (string, err } data, err := sec.Data() if err != nil { - return "", fmt.Errorf("failed to read ELF section %v: %v", sec.Name, err) + return "", fmt.Errorf("failed to read ELF section %v: %w", sec.Name, err) } hasher1 := sha256.New() hasher1.Write(data) diff --git a/pkg/build/linux_linux.go b/pkg/build/linux_linux.go index d22fea678..c81ccf28e 100644 --- a/pkg/build/linux_linux.go +++ b/pkg/build/linux_linux.go @@ -58,7 +58,7 @@ func embedFiles(params Params, callback func(mountDir string) error) error { return err } if err := tryMount(loopFile+"p1", mountDir); err != nil { - return fmt.Errorf("mount(%vp1, %v) failed: %v", loopFile, mountDir, err) + return fmt.Errorf("mount(%vp1, %v) failed: %w", loopFile, mountDir, err) } defer unix.Unmount(mountDir, 0) if err := callback(mountDir); err != nil { @@ -122,26 +122,26 @@ func copyKernel(mountDir, kernelPath string) error { func linuxSetupLoop(imageFile string) (int, string, error) { image, err := unix.Open(imageFile, unix.O_RDWR, 0) if err != nil { - return 0, "", fmt.Errorf("failed to open %v: %v", imageFile, err) + return 0, "", fmt.Errorf("failed to open %v: %w", imageFile, err) } defer unix.Close(image) loopControl, err := unix.Open("/dev/loop-control", unix.O_RDWR, 0) if err != nil { - return 0, "", fmt.Errorf("failed to open /dev/loop-control: %v", err) + return 0, "", fmt.Errorf("failed to open /dev/loop-control: %w", err) } defer unix.Close(loopControl) loopIndex, err := unix.IoctlRetInt(loopControl, unix.LOOP_CTL_GET_FREE) if err != nil { - return 0, "", fmt.Errorf("LOOP_CTL_GET_FREE failed: %v", err) + return 0, "", fmt.Errorf("LOOP_CTL_GET_FREE failed: %w", err) } loopFile := fmt.Sprintf("/dev/loop%v", loopIndex) loop, err := unix.Open(loopFile, unix.O_RDWR, 0) if err != nil { - return 0, "", fmt.Errorf("failed to open %v: %v", loopFile, err) + return 0, "", fmt.Errorf("failed to open %v: %w", loopFile, err) } if err := unix.IoctlSetInt(loop, unix.LOOP_SET_FD, image); err != nil { unix.Close(loop) - return 0, "", fmt.Errorf("LOOP_SET_FD failed: %v", err) + return 0, "", fmt.Errorf("LOOP_SET_FD failed: %w", err) } info := &unix.LoopInfo64{ Flags: unix.LO_FLAGS_PARTSCAN, @@ -152,7 +152,7 @@ func linuxSetupLoop(imageFile string) (int, string, error) { if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, uintptr(loop), unix.LOOP_SET_STATUS64, uintptr(unsafe.Pointer(info))); err != 0 { unix.Close(loop) - return 0, "", fmt.Errorf("LOOP_SET_STATUS64 failed: %v", err) + return 0, "", fmt.Errorf("LOOP_SET_STATUS64 failed: %w", err) } return loop, loopFile, nil } diff --git a/pkg/build/netbsd.go b/pkg/build/netbsd.go index b569b9833..8717b8105 100644 --- a/pkg/build/netbsd.go +++ b/pkg/build/netbsd.go @@ -75,12 +75,12 @@ func (ctx netbsd) build(params Params) (ImageDetails, error) { fullSrc := filepath.Join(s.dir, s.src) fullDst := filepath.Join(params.OutputDir, s.dst) if err := osutil.CopyFile(fullSrc, fullDst); err != nil { - return ImageDetails{}, fmt.Errorf("failed to copy %v -> %v: %v", fullSrc, fullDst, err) + return ImageDetails{}, fmt.Errorf("failed to copy %v -> %v: %w", fullSrc, fullDst, err) } } keyFile := filepath.Join(params.OutputDir, "key") if err := os.Chmod(keyFile, 0600); err != nil { - return ImageDetails{}, fmt.Errorf("failed to chmod 0600 %v: %v", keyFile, err) + return ImageDetails{}, fmt.Errorf("failed to chmod 0600 %v: %w", keyFile, err) } return ImageDetails{}, ctx.copyKernelToDisk(params.TargetArch, params.VMType, params.OutputDir, filepath.Join(compileDir, "netbsd")) @@ -117,23 +117,23 @@ func (ctx netbsd) copyKernelToDisk(targetArch, vmType, outputDir, kernel string) // Create a VM pool. pool, err := vm.Create(cfg, false) if err != nil { - return fmt.Errorf("failed to create a VM Pool: %v", err) + return fmt.Errorf("failed to create a VM Pool: %w", err) } // Create a new reporter instance. reporter, err := report.NewReporter(cfg) if err != nil { - return fmt.Errorf("failed to create a Reporter: %v", err) + return fmt.Errorf("failed to create a Reporter: %w", err) } // Create a VM instance (we need only one). inst, err := pool.Create(0) if err != nil { - return fmt.Errorf("failed to create the VM Instance: %v", err) + return fmt.Errorf("failed to create the VM Instance: %w", err) } defer inst.Close() // Copy the kernel into the disk image and replace it. kernel, err = inst.Copy(kernel) if err != nil { - return fmt.Errorf("error copying the kernel: %v", err) + return fmt.Errorf("error copying the kernel: %w", err) } if kernel != "/netbsd" { return fmt.Errorf("kernel is copied into wrong location: %v", kernel) @@ -153,7 +153,7 @@ func (ctx netbsd) copyKernelToDisk(targetArch, vmType, outputDir, kernel string) commands = append(commands, "sync") // Run sync so that the copied image is stored properly. outc, errc, err := inst.Run(time.Minute, nil, strings.Join(commands, ";")) if err != nil { - return fmt.Errorf("error syncing the instance %v", err) + return fmt.Errorf("error syncing the instance %w", err) } // Make sure that the command has executed properly. rep := inst.MonitorExecution(outc, errc, reporter, vm.ExitNormal) diff --git a/pkg/build/openbsd.go b/pkg/build/openbsd.go index 60a35d190..97f7c6a8f 100644 --- a/pkg/build/openbsd.go +++ b/pkg/build/openbsd.go @@ -45,7 +45,7 @@ func (ctx openbsd) build(params Params) (ImageDetails, error) { fullSrc := filepath.Join(s.dir, s.src) fullDst := filepath.Join(params.OutputDir, s.dst) if err := osutil.CopyFile(fullSrc, fullDst); err != nil { - return ImageDetails{}, fmt.Errorf("failed to copy %v -> %v: %v", fullSrc, fullDst, err) + return ImageDetails{}, fmt.Errorf("failed to copy %v -> %v: %w", fullSrc, fullDst, err) } } if params.VMType == "gce" { diff --git a/pkg/config/config.go b/pkg/config/config.go index 503a5b466..63c10213d 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -19,7 +19,7 @@ func LoadFile(filename string, cfg interface{}) error { } data, err := os.ReadFile(filename) if err != nil { - return fmt.Errorf("failed to read config file: %v", err) + return fmt.Errorf("failed to read config file: %w", err) } return LoadData(data, cfg) } @@ -30,7 +30,7 @@ func LoadData(data []byte, cfg interface{}) error { dec := json.NewDecoder(bytes.NewReader(data)) dec.DisallowUnknownFields() if err := dec.Decode(cfg); err != nil { - return fmt.Errorf("failed to parse config file: %v", err) + return fmt.Errorf("failed to parse config file: %w", err) } return nil } diff --git a/pkg/cover/backend/dwarf.go b/pkg/cover/backend/dwarf.go index 40f345614..1a8217cb1 100644 --- a/pkg/cover/backend/dwarf.go +++ b/pkg/cover/backend/dwarf.go @@ -364,7 +364,7 @@ func symbolizeModule(target *targets.Target, objDir, srcDir, buildDir string, } frames, err := symb.SymbolizeArray(mod.Path, pcs) if err != nil { - res.err = fmt.Errorf("failed to symbolize: %v", err) + res.err = fmt.Errorf("failed to symbolize: %w", err) } res.frames = append(res.frames, frames...) } @@ -491,7 +491,7 @@ func objdump(target *targets.Target, mod *Module) ([2][]uint64, error) { } defer stderr.Close() if err := cmd.Start(); err != nil { - return pcs, fmt.Errorf("failed to run objdump on %v: %v", mod.Path, err) + return pcs, fmt.Errorf("failed to run objdump on %v: %w", mod.Path, err) } defer func() { cmd.Process.Kill() @@ -506,10 +506,10 @@ func objdump(target *targets.Target, mod *Module) ([2][]uint64, error) { } stderrOut, _ := io.ReadAll(stderr) if err := cmd.Wait(); err != nil { - return pcs, fmt.Errorf("failed to run objdump on %v: %v\n%s", mod.Path, err, stderrOut) + return pcs, fmt.Errorf("failed to run objdump on %v: %w\n%s", mod.Path, err, stderrOut) } if err := s.Err(); err != nil { - return pcs, fmt.Errorf("failed to run objdump on %v: %v\n%s", mod.Path, err, stderrOut) + return pcs, fmt.Errorf("failed to run objdump on %v: %w\n%s", mod.Path, err, stderrOut) } return pcs, nil } diff --git a/pkg/cover/backend/elf.go b/pkg/cover/backend/elf.go index 57908f43a..c9a02aba4 100644 --- a/pkg/cover/backend/elf.go +++ b/pkg/cover/backend/elf.go @@ -64,7 +64,7 @@ func elfReadSymbols(module *Module, info *symbolInfo) ([]*Symbol, error) { } allSymbols, err := file.Symbols() if err != nil { - return nil, fmt.Errorf("failed to read ELF symbols: %v", err) + return nil, fmt.Errorf("failed to read ELF symbols: %w", err) } if module.Name == "" { info.textAddr = text.Addr @@ -121,7 +121,7 @@ func elfReadTextRanges(module *Module) ([]pcRange, []*CompileUnit, error) { log.Logf(0, "ignoring module %v without DEBUG_INFO", module.Name) return nil, nil, nil } - return nil, nil, fmt.Errorf("failed to parse DWARF: %v (set CONFIG_DEBUG_INFO=y on linux)", err) + return nil, nil, fmt.Errorf("failed to parse DWARF: %w (set CONFIG_DEBUG_INFO=y on linux)", err) } var pcFix pcFixFn diff --git a/pkg/cover/backend/gvisor.go b/pkg/cover/backend/gvisor.go index 155b4cdf4..8e2a32d48 100644 --- a/pkg/cover/backend/gvisor.go +++ b/pkg/cover/backend/gvisor.go @@ -111,7 +111,7 @@ func gvisorParseLine(s *bufio.Scanner) (Frame, error) { for i := range ints { x, err := strconv.ParseUint(match[i+3], 0, 32) if err != nil { - return Frame{}, fmt.Errorf("failed to parse number %q: %v", match[i+3], err) + return Frame{}, fmt.Errorf("failed to parse number %q: %w", match[i+3], err) } ints[i] = int(x) } diff --git a/pkg/cover/backend/mach-o.go b/pkg/cover/backend/mach-o.go index ac29f9c0b..67e28c625 100644 --- a/pkg/cover/backend/mach-o.go +++ b/pkg/cover/backend/mach-o.go @@ -98,7 +98,7 @@ func machoReadTextRanges(module *Module) ([]pcRange, []*CompileUnit, error) { } debugInfo, err := dSYM.DWARF() if err != nil { - return nil, nil, fmt.Errorf("failed to parse DWARF: %v", err) + return nil, nil, fmt.Errorf("failed to parse DWARF: %w", err) } return readTextRanges(debugInfo, module, nil) } diff --git a/pkg/cover/backend/modules.go b/pkg/cover/backend/modules.go index e0dd6bea5..4da73d3ad 100644 --- a/pkg/cover/backend/modules.go +++ b/pkg/cover/backend/modules.go @@ -96,7 +96,7 @@ func getModuleName(path string) (string, error) { } data, err := section.Data() if err != nil { - return "", fmt.Errorf("failed to read .modinfo: %v", err) + return "", fmt.Errorf("failed to read .modinfo: %w", err) } if name := searchModuleName(data); name != "" { return name, nil @@ -107,7 +107,7 @@ func getModuleName(path string) (string, error) { } data, err = section.Data() if err != nil { - return "", fmt.Errorf("failed to read .gnu.linkonce.this_module: %v", err) + return "", fmt.Errorf("failed to read .gnu.linkonce.this_module: %w", err) } return string(data), nil } diff --git a/pkg/cover/html.go b/pkg/cover/html.go index 874160c8c..92e5cf2bd 100644 --- a/pkg/cover/html.go +++ b/pkg/cover/html.go @@ -145,7 +145,7 @@ func (rg *ReportGenerator) DoLineJSON(w io.Writer, progs []Prog, coverFilter map encoder := json.NewEncoder(w) encoder.SetIndent("", "\t") if err := encoder.Encode(entries); err != nil { - return fmt.Errorf("encoding [%v] entries failed: %v", len(entries), err) + return fmt.Errorf("encoding [%v] entries failed: %w", len(entries), err) } return nil } diff --git a/pkg/csource/build.go b/pkg/csource/build.go index af41f66d3..35d97d023 100644 --- a/pkg/csource/build.go +++ b/pkg/csource/build.go @@ -83,7 +83,7 @@ func Format(src []byte) ([]byte, error) { cmd.Stdout = stdout cmd.Stderr = stderr if err := cmd.Run(); err != nil { - return src, fmt.Errorf("failed to format source: %v\n%v", err, stderr.String()) + return src, fmt.Errorf("failed to format source: %w\n%v", err, stderr.String()) } return stdout.Bytes(), nil } diff --git a/pkg/csource/common.go b/pkg/csource/common.go index 3b30d85f4..2d62f0707 100644 --- a/pkg/csource/common.go +++ b/pkg/csource/common.go @@ -48,7 +48,7 @@ func createCommonHeader(p, mmapProg *prog.Prog, replacements map[string]string, // 3776 | #if not SYZ_SANDBOX_ANDROID // Potentially we could analyze errors manually and ignore only the expected ones. if err := cmd.Run(); len(stdout.Bytes()) == 0 { - return nil, fmt.Errorf("cpp failed: %v %v: %v\n%v\n%v", cmd.Path, cmd.Args, err, stdout.String(), stderr.String()) + return nil, fmt.Errorf("cpp failed: %v %v: %w\n%v\n%v", cmd.Path, cmd.Args, err, stdout.String(), stderr.String()) } src, err := removeSystemDefines(stdout.Bytes(), defines) diff --git a/pkg/csource/csource.go b/pkg/csource/csource.go index 54cf2fa39..a56a738c5 100644 --- a/pkg/csource/csource.go +++ b/pkg/csource/csource.go @@ -39,7 +39,7 @@ import ( // Write generates C source for program p based on the provided options opt. func Write(p *prog.Prog, opts Options) ([]byte, error) { if err := opts.Check(p.Target.OS); err != nil { - return nil, fmt.Errorf("csource: invalid opts: %v", err) + return nil, fmt.Errorf("csource: invalid opts: %w", err) } ctx := &context{ p: p, @@ -241,7 +241,7 @@ func (ctx *context) generateProgCalls(p *prog.Prog, trace bool) ([]string, []uin exec := make([]byte, prog.ExecBufferSize) progSize, err := p.SerializeForExec(exec) if err != nil { - return nil, nil, fmt.Errorf("failed to serialize program: %v", err) + return nil, nil, fmt.Errorf("failed to serialize program: %w", err) } decoded, err := ctx.target.DeserializeExec(exec[:progSize]) if err != nil { diff --git a/pkg/db/db.go b/pkg/db/db.go index 203761dfa..2d75f6489 100644 --- a/pkg/db/db.go +++ b/pkg/db/db.go @@ -186,7 +186,7 @@ func deserializeDB(r *bufio.Reader) (version uint64, records map[string]Record, records = make(map[string]Record) ver, err := deserializeHeader(r) if err != nil { - err0 = fmt.Errorf("failed to deserialize database header: %v", err) + err0 = fmt.Errorf("failed to deserialize database header: %w", err) return } version = ver @@ -196,7 +196,7 @@ func deserializeDB(r *bufio.Reader) (version uint64, records map[string]Record, return } if err != nil { - err0 = fmt.Errorf("failed to deserialize database record: %v", err) + err0 = fmt.Errorf("failed to deserialize database record: %w", err) return } uncompacted++ @@ -277,16 +277,16 @@ func Create(filename string, version uint64, records []Record) error { os.Remove(filename) db, err := Open(filename, true) if err != nil { - return fmt.Errorf("failed to open database file: %v", err) + return fmt.Errorf("failed to open database file: %w", err) } if err := db.BumpVersion(version); err != nil { - return fmt.Errorf("failed to bump database version: %v", err) + return fmt.Errorf("failed to bump database version: %w", err) } for _, rec := range records { db.Save(hash.String(rec.Val), rec.Val, rec.Seq) } if err := db.Flush(); err != nil { - return fmt.Errorf("failed to save database file: %v", err) + return fmt.Errorf("failed to save database file: %w", err) } return nil } @@ -297,12 +297,12 @@ func ReadCorpus(filename string, target *prog.Target) (progs []*prog.Prog, err e } db, err := Open(filename, false) if err != nil { - return nil, fmt.Errorf("failed to open database file: %v", err) + return nil, fmt.Errorf("failed to open database file: %w", err) } for _, rec := range db.Records { p, err := target.Deserialize(rec.Val, prog.NonStrict) if err != nil { - return nil, fmt.Errorf("failed to deserialize corpus program: %v", err) + return nil, fmt.Errorf("failed to deserialize corpus program: %w", err) } progs = append(progs, p) } diff --git a/pkg/email/parser.go b/pkg/email/parser.go index cd454646c..2ed9495fd 100644 --- a/pkg/email/parser.go +++ b/pkg/email/parser.go @@ -76,11 +76,11 @@ func prepareEmails(list []string) map[string]bool { func Parse(r io.Reader, ownEmails, goodLists, domains []string) (*Email, error) { msg, err := mail.ReadMessage(r) if err != nil { - return nil, fmt.Errorf("failed to read email: %v", err) + return nil, fmt.Errorf("failed to read email: %w", err) } from, err := msg.Header.AddressList("From") if err != nil { - return nil, fmt.Errorf("failed to parse email header 'From': %v", err) + return nil, fmt.Errorf("failed to parse email header 'From': %w", err) } if len(from) == 0 { return nil, fmt.Errorf("failed to parse email header 'To': no senders") @@ -194,7 +194,7 @@ func Parse(r io.Reader, ownEmails, goodLists, domains []string) (*Email, error) func AddAddrContext(email, context string) (string, error) { addr, err := mail.ParseAddress(email) if err != nil { - return "", fmt.Errorf("failed to parse %q as email: %v", email, err) + return "", fmt.Errorf("failed to parse %q as email: %w", email, err) } at := strings.IndexByte(addr.Address, '@') if at == -1 { @@ -213,7 +213,7 @@ func AddAddrContext(email, context string) (string, error) { func RemoveAddrContext(email string) (string, string, error) { addr, err := mail.ParseAddress(email) if err != nil { - return "", "", fmt.Errorf("failed to parse %q as email: %v", email, err) + return "", "", fmt.Errorf("failed to parse %q as email: %w", email, err) } at := strings.IndexByte(addr.Address, '@') if at == -1 { @@ -386,7 +386,7 @@ func parseBody(r io.Reader, headers mail.Header) ([]byte, [][]byte, error) { var err error mediaType, params, err = mime.ParseMediaType(headers.Get("Content-Type")) if err != nil { - return nil, nil, fmt.Errorf("failed to parse email header 'Content-Type': %v", err) + return nil, nil, fmt.Errorf("failed to parse email header 'Content-Type': %w", err) } } switch strings.ToLower(headers.Get("Content-Transfer-Encoding")) { @@ -399,14 +399,14 @@ func parseBody(r io.Reader, headers mail.Header) ([]byte, [][]byte, error) { if disp == "attachment" { attachment, err := io.ReadAll(r) if err != nil { - return nil, nil, fmt.Errorf("failed to read email body: %v", err) + return nil, nil, fmt.Errorf("failed to read email body: %w", err) } return nil, [][]byte{attachment}, nil } if mediaType == "text/plain" { body, err := io.ReadAll(r) if err != nil { - return nil, nil, fmt.Errorf("failed to read email body: %v", err) + return nil, nil, fmt.Errorf("failed to read email body: %w", err) } return body, nil, nil } @@ -422,7 +422,7 @@ func parseBody(r io.Reader, headers mail.Header) ([]byte, [][]byte, error) { return body, attachments, nil } if err != nil { - return nil, nil, fmt.Errorf("failed to parse MIME parts: %v", err) + return nil, nil, fmt.Errorf("failed to parse MIME parts: %w", err) } body1, attachments1, err1 := parseBody(p, mail.Header(p.Header)) if err1 != nil { diff --git a/pkg/gce/gce.go b/pkg/gce/gce.go index f461df604..71b88e2ec 100644 --- a/pkg/gce/gce.go +++ b/pkg/gce/gce.go @@ -55,7 +55,7 @@ func NewContext(customZoneID string) (*Context, error) { background := context.Background() tokenSource, err := google.DefaultTokenSource(background, compute.CloudPlatformScope) if err != nil { - return nil, fmt.Errorf("failed to get a token source: %v", err) + return nil, fmt.Errorf("failed to get a token source: %w", err) } httpClient := oauth2.NewClient(background, tokenSource) // nolint @@ -67,11 +67,11 @@ func NewContext(customZoneID string) (*Context, error) { // Obtain project name, zone and current instance IP address. ctx.ProjectID, err = ctx.getMeta("project/project-id") if err != nil { - return nil, fmt.Errorf("failed to query gce project-id: %v", err) + return nil, fmt.Errorf("failed to query gce project-id: %w", err) } myZoneID, err := ctx.getMeta("instance/zone") if err != nil { - return nil, fmt.Errorf("failed to query gce zone: %v", err) + return nil, fmt.Errorf("failed to query gce zone: %w", err) } if i := strings.LastIndexByte(myZoneID, '/'); i != -1 { myZoneID = myZoneID[i+1:] // the query returns some nonsense prefix @@ -83,11 +83,11 @@ func NewContext(customZoneID string) (*Context, error) { } ctx.Instance, err = ctx.getMeta("instance/name") if err != nil { - return nil, fmt.Errorf("failed to query gce instance name: %v", err) + return nil, fmt.Errorf("failed to query gce instance name: %w", err) } inst, err := ctx.computeService.Instances.Get(ctx.ProjectID, myZoneID, ctx.Instance).Do() if err != nil { - return nil, fmt.Errorf("error getting instance info: %v", err) + return nil, fmt.Errorf("error getting instance info: %w", err) } for _, iface := range inst.NetworkInterfaces { if strings.HasPrefix(iface.NetworkIP, "10.") { @@ -167,7 +167,7 @@ retry: return }) if err != nil { - return "", fmt.Errorf("failed to create instance: %v", err) + return "", fmt.Errorf("failed to create instance: %w", err) } if err := ctx.waitForCompletion("zone", "create image", op.Name, false); err != nil { if _, ok := err.(resourcePoolExhaustedError); ok && instance.Scheduling.Preemptible { @@ -183,7 +183,7 @@ retry: return }) if err != nil { - return "", fmt.Errorf("error getting instance %s details after creation: %v", name, err) + return "", fmt.Errorf("error getting instance %s details after creation: %w", name, err) } // Finds its internal IP. @@ -210,7 +210,7 @@ func (ctx *Context) DeleteInstance(name string, wait bool) error { return nil } if err != nil { - return fmt.Errorf("failed to delete instance: %v", err) + return fmt.Errorf("failed to delete instance: %w", err) } if wait { if err := ctx.waitForCompletion("zone", "delete image", op.Name, true); err != nil { @@ -255,7 +255,7 @@ func (ctx *Context) CreateImage(imageName, gcsFile string) error { return }) if err != nil { - return fmt.Errorf("failed to create image: %v", err) + return fmt.Errorf("failed to create image: %w", err) } } if err := ctx.waitForCompletion("global", "create image", op.Name, false); err != nil { @@ -274,7 +274,7 @@ func (ctx *Context) DeleteImage(imageName string) error { return nil } if err != nil { - return fmt.Errorf("failed to delete image: %v", err) + return fmt.Errorf("failed to delete image: %w", err) } if err := ctx.waitForCompletion("global", "delete image", op.Name, true); err != nil { return err @@ -305,7 +305,7 @@ func (ctx *Context) waitForCompletion(typ, desc, opName string, ignoreNotFound b return }) if err != nil { - return fmt.Errorf("failed to get %v operation %v: %v", desc, opName, err) + return fmt.Errorf("failed to get %v operation %v: %w", desc, opName, err) } switch op.Status { case "PENDING", "RUNNING": diff --git a/pkg/gcs/gcs.go b/pkg/gcs/gcs.go index e0ccd39c5..2b7a87ab9 100644 --- a/pkg/gcs/gcs.go +++ b/pkg/gcs/gcs.go @@ -64,7 +64,7 @@ func (client *Client) Read(gcsFile string) (*File, error) { f := bkt.Object(filename) attrs, err := f.Attrs(client.ctx) if err != nil { - return nil, fmt.Errorf("failed to read %v attributes: %v", gcsFile, err) + return nil, fmt.Errorf("failed to read %v attributes: %w", gcsFile, err) } if !attrs.Deleted.IsZero() { return nil, fmt.Errorf("file %v is deleted", gcsFile) diff --git a/pkg/hash/hash.go b/pkg/hash/hash.go index 94bcda4fb..246fc4b2f 100644 --- a/pkg/hash/hash.go +++ b/pkg/hash/hash.go @@ -44,7 +44,7 @@ func (sig *Sig) Truncate64() int64 { func FromString(str string) (Sig, error) { bin, err := hex.DecodeString(str) if err != nil { - return Sig{}, fmt.Errorf("failed to decode sig '%v': %v", str, err) + return Sig{}, fmt.Errorf("failed to decode sig '%v': %w", str, err) } if len(bin) != len(Sig{}) { return Sig{}, fmt.Errorf("failed to decode sig '%v': bad len", str) diff --git a/pkg/host/machine_info_linux.go b/pkg/host/machine_info_linux.go index d46dacd4e..980081898 100644 --- a/pkg/host/machine_info_linux.go +++ b/pkg/host/machine_info_linux.go @@ -136,11 +136,11 @@ func parseModules(modulesText []byte) ([]KernelModule, error) { for _, m := range re.FindAllSubmatch(modulesText, -1) { addr, err := strconv.ParseUint(string(m[3]), 0, 64) if err != nil { - return nil, fmt.Errorf("address parsing error in /proc/modules: %v", err) + return nil, fmt.Errorf("address parsing error in /proc/modules: %w", err) } size, err := strconv.ParseUint(string(m[2]), 0, 64) if err != nil { - return nil, fmt.Errorf("module size parsing error in /proc/modules: %v", err) + return nil, fmt.Errorf("module size parsing error in /proc/modules: %w", err) } modules = append(modules, KernelModule{ Name: string(m[1]), diff --git a/pkg/ifuzz/x86/gen/gen.go b/pkg/ifuzz/x86/gen/gen.go index acec104fe..aae7429c0 100644 --- a/pkg/ifuzz/x86/gen/gen.go +++ b/pkg/ifuzz/x86/gen/gen.go @@ -245,21 +245,21 @@ func parsePattern(insn *x86.Insn, vals []string) error { insn.Modrm = true vv, err := parseModrm(v[3:]) if err != nil { - return fmt.Errorf("failed to parse %v: %v", v, err) + return fmt.Errorf("failed to parse %v: %w", v, err) } insn.Mod = vv case strings.HasPrefix(v, "REG["): insn.Modrm = true vv, err := parseModrm(v[3:]) if err != nil { - return fmt.Errorf("failed to parse %v: %v", v, err) + return fmt.Errorf("failed to parse %v: %w", v, err) } insn.Reg = vv case strings.HasPrefix(v, "RM["): insn.Modrm = true vv, err := parseModrm(v[2:]) if err != nil { - return fmt.Errorf("failed to parse %v: %v", v, err) + return fmt.Errorf("failed to parse %v: %w", v, err) } insn.Rm = vv case v == "RM=4": @@ -267,7 +267,7 @@ func parsePattern(insn *x86.Insn, vals []string) error { case strings.HasPrefix(v, "SRM["): vv, err := parseModrm(v[3:]) if err != nil { - return fmt.Errorf("failed to parse %v: %v", v, err) + return fmt.Errorf("failed to parse %v: %w", v, err) } insn.Rm = vv insn.Srm = true diff --git a/pkg/image/compression.go b/pkg/image/compression.go index 70e314ae5..d41392019 100644 --- a/pkg/image/compression.go +++ b/pkg/image/compression.go @@ -45,11 +45,11 @@ func decompressWriter(w io.Writer, compressed []byte) error { } zlibReader, err := zlib.NewReader(bytes.NewReader(compressed)) if err != nil { - return fmt.Errorf("could not initialise zlib: %v", err) + return fmt.Errorf("could not initialise zlib: %w", err) } if _, err := io.Copy(w, zlibReader); err != nil { - return fmt.Errorf("could not read data with zlib: %v", err) + return fmt.Errorf("could not read data with zlib: %w", err) } return zlibReader.Close() @@ -59,7 +59,7 @@ func DecodeB64(b64Data []byte) ([]byte, error) { decoder := base64.NewDecoder(base64.StdEncoding, bytes.NewReader(b64Data)) rawData, err := io.ReadAll(decoder) if err != nil { - return nil, fmt.Errorf("could not decode Base64: %v", err) + return nil, fmt.Errorf("could not decode Base64: %w", err) } return rawData, nil } diff --git a/pkg/instance/execprog.go b/pkg/instance/execprog.go index 8f052f629..9e97dcd0c 100644 --- a/pkg/instance/execprog.go +++ b/pkg/instance/execprog.go @@ -83,7 +83,7 @@ func CreateExecProgInstance(vmPool *vm.Pool, vmIndex int, mgrCfg *mgrconfig.Conf reporter *report.Reporter, opt *OptionalConfig) (*ExecProgInstance, error) { vmInst, err := vmPool.Create(vmIndex) if err != nil { - return nil, fmt.Errorf("failed to create VM: %v", err) + return nil, fmt.Errorf("failed to create VM: %w", err) } ret, err := SetupExecProg(vmInst, mgrCfg, reporter, opt) if err != nil { @@ -109,7 +109,7 @@ func (inst *ExecProgInstance) runCommand(command string, duration time.Duration) } outc, errc, err := inst.VMInstance.Run(duration, nil, command) if err != nil { - return nil, fmt.Errorf("failed to run command in VM: %v", err) + return nil, fmt.Errorf("failed to run command in VM: %w", err) } result := &RunResult{ ExecutionResult: *inst.VMInstance.MonitorExecutionRaw(outc, errc, diff --git a/pkg/instance/instance.go b/pkg/instance/instance.go index 3dd654f2b..ea4084def 100644 --- a/pkg/instance/instance.go +++ b/pkg/instance/instance.go @@ -65,7 +65,7 @@ func NewEnv(cfg *mgrconfig.Config, buildSem, testSem *Semaphore) (Env, error) { return nil, fmt.Errorf("syzkaller path is empty") } if err := osutil.MkdirAll(cfg.Workdir); err != nil { - return nil, fmt.Errorf("failed to create tmp dir: %v", err) + return nil, fmt.Errorf("failed to create tmp dir: %w", err) } env := &env{ cfg: cfg, @@ -88,14 +88,14 @@ func (env *env) BuildSyzkaller(repoURL, commit string) (string, error) { } repo := vcs.NewSyzkallerRepo(cfg.Syzkaller) if _, err := repo.CheckoutCommit(repoURL, commit); err != nil { - return "", fmt.Errorf("failed to checkout syzkaller repo: %v", err) + return "", fmt.Errorf("failed to checkout syzkaller repo: %w", err) } // The following commit ("syz-fuzzer: support optional flags") adds support for optional flags // in syz-fuzzer and syz-execprog. This is required to invoke older binaries with newer flags // without failing due to unknown flags. optionalFlags, err := repo.Contains("64435345f0891706a7e0c7885f5f7487581e6005") if err != nil { - return "", fmt.Errorf("optional flags check failed: %v", err) + return "", fmt.Errorf("optional flags check failed: %w", err) } env.optionalFlags = optionalFlags cmd := osutil.Command(MakeBin, "target") @@ -128,7 +128,7 @@ func (env *env) BuildSyzkaller(repoURL, commit string) (string, error) { buildLog := fmt.Sprintf("go env (err=%v)\n%s\ngit status (err=%v)\n%s\n\n%s", goEnvErr, goEnvOut, gitStatusErr, gitStatusOut, buildOutput) if buildErr != nil { - return buildLog, fmt.Errorf("syzkaller build failed: %v\n%s", buildErr, buildLog) + return buildLog, fmt.Errorf("syzkaller build failed: %w\n%s", buildErr, buildLog) } return buildLog, nil } @@ -176,7 +176,7 @@ func SetConfigImage(cfg *mgrconfig.Config, imageDir string, reliable bool) error } vmConfig := make(map[string]interface{}) if err := json.Unmarshal(cfg.VM, &vmConfig); err != nil { - return fmt.Errorf("failed to parse VM config: %v", err) + return fmt.Errorf("failed to parse VM config: %w", err) } if cfg.Type == "qemu" || cfg.Type == "vmm" { if kernel := filepath.Join(imageDir, "kernel"); osutil.IsExist(kernel) { @@ -192,7 +192,7 @@ func SetConfigImage(cfg *mgrconfig.Config, imageDir string, reliable bool) error } vmCfg, err := json.Marshal(vmConfig) if err != nil { - return fmt.Errorf("failed to serialize VM config: %v", err) + return fmt.Errorf("failed to serialize VM config: %w", err) } cfg.VM = vmCfg return nil @@ -201,7 +201,7 @@ func SetConfigImage(cfg *mgrconfig.Config, imageDir string, reliable bool) error func OverrideVMCount(cfg *mgrconfig.Config, n int) error { vmConfig := make(map[string]interface{}) if err := json.Unmarshal(cfg.VM, &vmConfig); err != nil { - return fmt.Errorf("failed to parse VM config: %v", err) + return fmt.Errorf("failed to parse VM config: %w", err) } if vmConfig["count"] == nil || !vm.AllowsOvercommit(cfg.Type) { return nil @@ -209,7 +209,7 @@ func OverrideVMCount(cfg *mgrconfig.Config, n int) error { vmConfig["count"] = n vmCfg, err := json.Marshal(vmConfig) if err != nil { - return fmt.Errorf("failed to serialize VM config: %v", err) + return fmt.Errorf("failed to serialize VM config: %w", err) } cfg.VM = vmCfg return nil @@ -252,7 +252,7 @@ func (env *env) Test(numVMs int, reproSyz, reproOpts, reproC []byte) ([]EnvTestR } vmPool, err := vm.Create(env.cfg, false) if err != nil { - return nil, fmt.Errorf("failed to create VM pool: %v", err) + return nil, fmt.Errorf("failed to create VM pool: %w", err) } if n := vmPool.Count(); numVMs > n { numVMs = n @@ -352,7 +352,7 @@ func (inst *inst) test() EnvTestResult { func (inst *inst) testInstance() error { ln, err := net.Listen("tcp", ":") if err != nil { - return fmt.Errorf("failed to open listening socket: %v", err) + return fmt.Errorf("failed to open listening socket: %w", err) } defer ln.Close() acceptErr := make(chan error, 1) @@ -365,7 +365,7 @@ func (inst *inst) testInstance() error { }() fwdAddr, err := inst.vm.Forward(ln.Addr().(*net.TCPAddr).Port) if err != nil { - return fmt.Errorf("failed to setup port forwarding: %v", err) + return fmt.Errorf("failed to setup port forwarding: %w", err) } fuzzerBin, err := inst.vm.Copy(inst.cfg.FuzzerBin) @@ -387,7 +387,7 @@ func (inst *inst) testInstance() error { 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) if err != nil { - return fmt.Errorf("failed to run binary in VM: %v", err) + return fmt.Errorf("failed to run binary in VM: %w", err) } rep := inst.vm.MonitorExecution(outc, errc, inst.reporter, vm.ExitNormal) if rep != nil { diff --git a/pkg/ipc/ipc.go b/pkg/ipc/ipc.go index f30b0afeb..542e75714 100644 --- a/pkg/ipc/ipc.go +++ b/pkg/ipc/ipc.go @@ -552,7 +552,7 @@ func makeCommand(pid int, bin []string, config *Config, inFile, outFile *os.File tmpDirPath string) (*command, error) { dir, err := os.MkdirTemp(tmpDirPath, "syzkaller-testdir") if err != nil { - return nil, fmt.Errorf("failed to create temp dir: %v", err) + return nil, fmt.Errorf("failed to create temp dir: %w", err) } dir = osutil.Abs(dir) @@ -578,20 +578,20 @@ func makeCommand(pid int, bin []string, config *Config, inFile, outFile *os.File }() if err := os.Chmod(dir, 0777); err != nil { - return nil, fmt.Errorf("failed to chmod temp dir: %v", err) + return nil, fmt.Errorf("failed to chmod temp dir: %w", err) } // Output capture pipe. rp, wp, err := os.Pipe() if err != nil { - return nil, fmt.Errorf("failed to create pipe: %v", err) + return nil, fmt.Errorf("failed to create pipe: %w", err) } defer wp.Close() // executor->ipc command pipe. inrp, inwp, err := os.Pipe() if err != nil { - return nil, fmt.Errorf("failed to create pipe: %v", err) + return nil, fmt.Errorf("failed to create pipe: %w", err) } defer inwp.Close() c.inrp = inrp @@ -599,7 +599,7 @@ func makeCommand(pid int, bin []string, config *Config, inFile, outFile *os.File // ipc->executor command pipe. outrp, outwp, err := os.Pipe() if err != nil { - return nil, fmt.Errorf("failed to create pipe: %v", err) + return nil, fmt.Errorf("failed to create pipe: %w", err) } defer outrp.Close() c.outwp = outwp @@ -644,7 +644,7 @@ func makeCommand(pid int, bin []string, config *Config, inFile, outFile *os.File }(c) } if err := cmd.Start(); err != nil { - return nil, fmt.Errorf("failed to start executor binary: %v", err) + return nil, fmt.Errorf("failed to start executor binary: %w", err) } c.exited = make(chan error, 1) c.cmd = cmd @@ -695,7 +695,7 @@ func (c *command) handshake() error { } reqData := (*[unsafe.Sizeof(*req)]byte)(unsafe.Pointer(req))[:] if _, err := c.outwp.Write(reqData); err != nil { - return c.handshakeError(fmt.Errorf("failed to write control pipe: %v", err)) + return c.handshakeError(fmt.Errorf("failed to write control pipe: %w", err)) } read := make(chan error, 1) @@ -729,7 +729,7 @@ func (c *command) handshake() error { func (c *command) handshakeError(err error) error { c.cmd.Process.Kill() output := <-c.readDone - err = fmt.Errorf("executor %v: %v\n%s", c.pid, err, output) + err = fmt.Errorf("executor %v: %w\n%s", c.pid, err, output) c.wait() return err } @@ -752,13 +752,13 @@ func (c *command) exec(opts *ExecOpts, progData []byte) (output []byte, hanged b reqData := (*[unsafe.Sizeof(*req)]byte)(unsafe.Pointer(req))[:] if _, err := c.outwp.Write(reqData); err != nil { output = <-c.readDone - err0 = fmt.Errorf("executor %v: failed to write control pipe: %v", c.pid, err) + err0 = fmt.Errorf("executor %v: failed to write control pipe: %w", c.pid, err) return } if progData != nil { if _, err := c.outwp.Write(progData); err != nil { output = <-c.readDone - err0 = fmt.Errorf("executor %v: failed to write control pipe: %v", c.pid, err) + err0 = fmt.Errorf("executor %v: failed to write control pipe: %w", c.pid, err) return } } @@ -836,7 +836,7 @@ func (c *command) exec(opts *ExecOpts, progData []byte) (output []byte, hanged b // Without fork server executor can legitimately exit (program contains exit_group), // with fork server the top process can exit with statusFail if it wants special handling. if exitStatus == statusFail { - err0 = fmt.Errorf("executor %v: exit status %d err %s\n%s", c.pid, exitStatus, err, output) + err0 = fmt.Errorf("executor %v: exit status %d err %w\n%s", c.pid, exitStatus, err, output) } return } diff --git a/pkg/ipc/ipc_test.go b/pkg/ipc/ipc_test.go index a3ab140f1..70f9dce94 100644 --- a/pkg/ipc/ipc_test.go +++ b/pkg/ipc/ipc_test.go @@ -151,7 +151,7 @@ func TestParallel(t *testing.T) { go func() { env, err := MakeEnv(cfg, p) if err != nil { - errs <- fmt.Errorf("failed to create env: %v", err) + errs <- fmt.Errorf("failed to create env: %w", err) return } defer func() { @@ -162,7 +162,7 @@ func TestParallel(t *testing.T) { opts := &ExecOpts{} output, info, hanged, err := env.Exec(opts, p) if err != nil { - err = fmt.Errorf("failed to run executor: %v", err) + err = fmt.Errorf("failed to run executor: %w", err) return } if hanged { diff --git a/pkg/kcidb/client.go b/pkg/kcidb/client.go index e04ba5dec..1c4d53764 100644 --- a/pkg/kcidb/client.go +++ b/pkg/kcidb/client.go @@ -57,7 +57,7 @@ func (c *Client) Publish(bug *dashapi.BugReport) error { } data, err := json.MarshalIndent(c.convert(target, bug), "", " ") if err != nil { - return fmt.Errorf("failed to marshal kcidb json: %v", err) + return fmt.Errorf("failed to marshal kcidb json: %w", err) } if err := kcidbValidate(data); err != nil { return err @@ -81,7 +81,7 @@ func kcidbValidate(data []byte) error { cmd.Stdin = bytes.NewReader(data) output, err := cmd.CombinedOutput() if err != nil { - return fmt.Errorf("%v failed (%v) on:\n%s\n\nerror: %s", + return fmt.Errorf("%v failed (%w) on:\n%s\n\nerror: %s", bin, err, data, output) } return nil diff --git a/pkg/kconfig/config.go b/pkg/kconfig/config.go index 4b01997a0..0f3f09dc2 100644 --- a/pkg/kconfig/config.go +++ b/pkg/kconfig/config.go @@ -107,7 +107,7 @@ func (cf *ConfigFile) Serialize() []byte { func ParseConfig(file string) (*ConfigFile, error) { data, err := os.ReadFile(file) if err != nil { - return nil, fmt.Errorf("failed to open .config file %v: %v", file, err) + return nil, fmt.Errorf("failed to open .config file %v: %w", file, err) } return ParseConfigData(data, file) } diff --git a/pkg/kconfig/kconfig.go b/pkg/kconfig/kconfig.go index cd05cdbb1..b5d0c0455 100644 --- a/pkg/kconfig/kconfig.go +++ b/pkg/kconfig/kconfig.go @@ -120,7 +120,7 @@ type kconfigParser struct { func Parse(target *targets.Target, file string) (*KConfig, error) { data, err := os.ReadFile(file) if err != nil { - return nil, fmt.Errorf("failed to open Kconfig file %v: %v", file, err) + return nil, fmt.Errorf("failed to open Kconfig file %v: %w", file, err) } return ParseData(target, data, file) } diff --git a/pkg/mgrconfig/load.go b/pkg/mgrconfig/load.go index 30cb89417..4a5febf79 100644 --- a/pkg/mgrconfig/load.go +++ b/pkg/mgrconfig/load.go @@ -123,7 +123,7 @@ func Complete(cfg *Config) error { if cfg.WorkdirTemplate != "" { cfg.WorkdirTemplate = osutil.Abs(cfg.WorkdirTemplate) if _, err := os.ReadDir(cfg.WorkdirTemplate); err != nil { - return fmt.Errorf("failed to read workdir_template: %v", err) + return fmt.Errorf("failed to read workdir_template: %w", err) } } if cfg.Image != "" { diff --git a/pkg/osutil/fileutil.go b/pkg/osutil/fileutil.go index 966560649..850335cfe 100644 --- a/pkg/osutil/fileutil.go +++ b/pkg/osutil/fileutil.go @@ -55,12 +55,12 @@ func WriteTempFile(data []byte) (string, error) { // Note: pkg/report knows about "syzkaller" prefix as it appears in crashes as process name. f, err := os.CreateTemp("", "syzkaller") if err != nil { - return "", fmt.Errorf("failed to create a temp file: %v", err) + return "", fmt.Errorf("failed to create a temp file: %w", err) } if _, err := f.Write(data); err != nil { f.Close() os.Remove(f.Name()) - return "", fmt.Errorf("failed to write a temp file: %v", err) + return "", fmt.Errorf("failed to write a temp file: %w", err) } f.Close() return f.Name(), nil diff --git a/pkg/osutil/fileutil_test.go b/pkg/osutil/fileutil_test.go index 20d02ea22..33a450fda 100644 --- a/pkg/osutil/fileutil_test.go +++ b/pkg/osutil/fileutil_test.go @@ -38,7 +38,7 @@ func TestProcessTempDir(t *testing.T) { go func() { dir, err := ProcessTempDir(tmp) if err != nil { - done <- fmt.Errorf("failed to create temp dir: %v", err) + done <- fmt.Errorf("failed to create temp dir: %w", err) return } mu.Lock() diff --git a/pkg/osutil/osutil.go b/pkg/osutil/osutil.go index ba1fb8729..1687cef9d 100644 --- a/pkg/osutil/osutil.go +++ b/pkg/osutil/osutil.go @@ -43,7 +43,7 @@ func Run(timeout time.Duration, cmd *exec.Cmd) ([]byte, error) { } setPdeathsig(cmd, true) if err := cmd.Start(); err != nil { - return nil, fmt.Errorf("failed to start %v %+v: %v", cmd.Path, cmd.Args, err) + return nil, fmt.Errorf("failed to start %v %+v: %w", cmd.Path, cmd.Args, err) } done := make(chan bool) timedout := make(chan bool, 1) @@ -125,7 +125,7 @@ func PrependContext(ctx string, err error) error { err1.Title = fmt.Sprintf("%v: %v", ctx, err1.Title) return err1 default: - return fmt.Errorf("%v: %v", ctx, err) + return fmt.Errorf("%v: %w", ctx, err) } } @@ -147,7 +147,7 @@ func IsAccessible(name string) error { } f, err := os.Open(name) if err != nil { - return fmt.Errorf("%v can't be opened (%v)", name, err) + return fmt.Errorf("%v can't be opened (%w)", name, err) } f.Close() return nil @@ -157,7 +157,7 @@ func IsAccessible(name string) error { func IsWritable(name string) error { f, err := os.OpenFile(name, os.O_WRONLY, DefaultFilePerm) if err != nil { - return fmt.Errorf("%v can't be written (%v)", name, err) + return fmt.Errorf("%v can't be written (%w)", name, err) } f.Close() return nil @@ -297,7 +297,7 @@ func WriteExecFile(filename string, data []byte) error { func TempFile(prefix string) (string, error) { f, err := os.CreateTemp("", prefix) if err != nil { - return "", fmt.Errorf("failed to create temp file: %v", err) + return "", fmt.Errorf("failed to create temp file: %w", err) } f.Close() return f.Name(), nil diff --git a/pkg/osutil/osutil_unix.go b/pkg/osutil/osutil_unix.go index 5563fb5fd..cf6b0284e 100644 --- a/pkg/osutil/osutil_unix.go +++ b/pkg/osutil/osutil_unix.go @@ -89,7 +89,7 @@ func HandleInterrupts(shutdown chan struct{}) { func LongPipe() (io.ReadCloser, io.WriteCloser, error) { r, w, err := os.Pipe() if err != nil { - return nil, nil, fmt.Errorf("failed to create pipe: %v", err) + return nil, nil, fmt.Errorf("failed to create pipe: %w", err) } prolongPipe(r, w) return r, w, err @@ -108,14 +108,14 @@ func CreateMemMappedFile(size int) (f *os.File, mem []byte, err error) { return } if err = f.Truncate(int64(size)); err != nil { - err = fmt.Errorf("failed to truncate shared mem file: %v", err) + err = fmt.Errorf("failed to truncate shared mem file: %w", err) CloseSharedMemFile(f) return } mem, err = syscall.Mmap(int(f.Fd()), 0, size, syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED) if err != nil { - err = fmt.Errorf("failed to mmap shm file: %v", err) + err = fmt.Errorf("failed to mmap shm file: %w", err) CloseSharedMemFile(f) } return diff --git a/pkg/osutil/sharedmem_memfd.go b/pkg/osutil/sharedmem_memfd.go index 9eb3a4075..213080e49 100644 --- a/pkg/osutil/sharedmem_memfd.go +++ b/pkg/osutil/sharedmem_memfd.go @@ -18,7 +18,7 @@ func CreateSharedMemFile(size int) (f *os.File, err error) { // The name is actually irrelevant and can even be the same for all such files. fd, err := unix.MemfdCreate("syz-shared-mem", unix.MFD_CLOEXEC) if err != nil { - err = fmt.Errorf("failed to do memfd_create: %v", err) + err = fmt.Errorf("failed to do memfd_create: %w", err) return } f = os.NewFile(uintptr(fd), fmt.Sprintf("/proc/self/fd/%d", fd)) diff --git a/pkg/report/decompile.go b/pkg/report/decompile.go index 6f5a6fe41..6134a1fd9 100644 --- a/pkg/report/decompile.go +++ b/pkg/report/decompile.go @@ -56,13 +56,13 @@ func DecompileOpcodes(rawOpcodes []byte, flags DecompilerFlagMask, target *targe func objdumpExecutor(rawOpcodes []byte, args []string, target *targets.Target) ([]byte, error) { fileName, err := osutil.TempFile("syz-opcode-decompiler") if err != nil { - return nil, fmt.Errorf("failed to create temp file: %v", err) + return nil, fmt.Errorf("failed to create temp file: %w", err) } defer os.Remove(fileName) err = osutil.WriteFile(fileName, rawOpcodes) if err != nil { - return nil, fmt.Errorf("failed to write to temp file: %v", err) + return nil, fmt.Errorf("failed to write to temp file: %w", err) } return osutil.RunCmd(objdumpCallTimeout, "", target.Objdump, append(args, fileName)...) diff --git a/pkg/report/report.go b/pkg/report/report.go index bc7fc8ca3..24029d092 100644 --- a/pkg/report/report.go +++ b/pkg/report/report.go @@ -165,7 +165,7 @@ func compileRegexps(list []string) ([]*regexp.Regexp, error) { for i, str := range list { re, err := regexp.Compile(str) if err != nil { - return nil, fmt.Errorf("failed to compile %q: %v", str, err) + return nil, fmt.Errorf("failed to compile %q: %w", str, err) } compiled[i] = re } diff --git a/pkg/repro/strace.go b/pkg/repro/strace.go index 07c3ea025..87d3cf64e 100644 --- a/pkg/repro/strace.go +++ b/pkg/repro/strace.go @@ -34,7 +34,7 @@ func RunStrace(result *Result, cfg *mgrconfig.Config, reporter *report.Reporter, BeforeContextLen: straceOutputLogSize, }) if err != nil { - return straceFailed(fmt.Errorf("failed to set up instance: %v", err)) + return straceFailed(fmt.Errorf("failed to set up instance: %w", err)) } defer inst.VMInstance.Close() @@ -47,7 +47,7 @@ func RunStrace(result *Result, cfg *mgrconfig.Config, reporter *report.Reporter, runRes, err = inst.RunSyzProg(result.Prog.Serialize(), result.Duration, result.Opts) } if err != nil { - return straceFailed(fmt.Errorf("failed to generate strace log: %v", err)) + return straceFailed(fmt.Errorf("failed to generate strace log: %w", err)) } return &StraceResult{ Report: runRes.Report, diff --git a/pkg/rpctype/rpc.go b/pkg/rpctype/rpc.go index 76c4c3f9c..6cf878543 100644 --- a/pkg/rpctype/rpc.go +++ b/pkg/rpctype/rpc.go @@ -23,7 +23,7 @@ type RPCServer struct { func NewRPCServer(addr, name string, receiver interface{}) (*RPCServer, error) { ln, err := net.Listen("tcp", addr) if err != nil { - return nil, fmt.Errorf("failed to listen on %v: %v", addr, err) + return nil, fmt.Errorf("failed to listen on %v: %w", addr, err) } s := rpc.NewServer() if err := s.RegisterName(name, receiver); err != nil { diff --git a/pkg/runtest/run.go b/pkg/runtest/run.go index 3e4543fab..4f6170fbb 100644 --- a/pkg/runtest/run.go +++ b/pkg/runtest/run.go @@ -176,7 +176,7 @@ func (ctx *Context) generatePrograms(progs chan *RunRequest) error { func progFileList(dir, filter string) ([]string, error) { files, err := os.ReadDir(dir) if err != nil { - return nil, fmt.Errorf("failed to read %v: %v", dir, err) + return nil, fmt.Errorf("failed to read %v: %w", dir, err) } var res []string for _, file := range files { @@ -276,7 +276,7 @@ nextSandbox: func parseProg(target *prog.Target, dir, filename string) (*prog.Prog, map[string]bool, *ipc.ProgInfo, error) { data, err := os.ReadFile(filepath.Join(dir, filename)) if err != nil { - return nil, nil, nil, fmt.Errorf("failed to read %v: %v", filename, err) + return nil, nil, nil, fmt.Errorf("failed to read %v: %w", filename, err) } requires := parseRequires(data) // Need to check arch requirement early as some programs @@ -286,7 +286,7 @@ func parseProg(target *prog.Target, dir, filename string) (*prog.Prog, map[strin } p, err := target.Deserialize(data, prog.Strict) if err != nil { - return nil, nil, nil, fmt.Errorf("failed to deserialize %v: %v", filename, err) + return nil, nil, nil, fmt.Errorf("failed to deserialize %v: %w", filename, err) } errnos := map[string]int{ "": 0, @@ -488,11 +488,11 @@ func (ctx *Context) createCTest(p *prog.Prog, sandbox string, threaded bool, tim } src, err := csource.Write(p, opts) if err != nil { - return nil, fmt.Errorf("failed to create C source: %v", err) + return nil, fmt.Errorf("failed to create C source: %w", err) } bin, err := csource.Build(p.Target, src) if err != nil { - return nil, fmt.Errorf("failed to build C program: %v", err) + return nil, fmt.Errorf("failed to build C program: %w", err) } var ipcFlags ipc.ExecFlags if threaded { @@ -654,14 +654,14 @@ func RunTest(req *RunRequest, executor string) { var err error env, err = ipc.MakeEnv(req.Cfg, 0) if err != nil { - req.Err = fmt.Errorf("failed to create ipc env: %v", err) + req.Err = fmt.Errorf("failed to create ipc env: %w", err) return } } output, info, hanged, err := env.Exec(req.Opts, req.P) req.Output = append(req.Output, output...) if err != nil { - req.Err = fmt.Errorf("run %v: failed to run: %v", run, err) + req.Err = fmt.Errorf("run %v: failed to run: %w", run, err) return } if hanged { @@ -682,7 +682,7 @@ func RunTest(req *RunRequest, executor string) { func runTestC(req *RunRequest) { tmpDir, err := os.MkdirTemp("", "syz-runtest") if err != nil { - req.Err = fmt.Errorf("failed to create temp dir: %v", err) + req.Err = fmt.Errorf("failed to create temp dir: %w", err) return } defer os.RemoveAll(tmpDir) diff --git a/pkg/symbolizer/nm.go b/pkg/symbolizer/nm.go index 471640b4f..6e0fc9016 100644 --- a/pkg/symbolizer/nm.go +++ b/pkg/symbolizer/nm.go @@ -59,11 +59,11 @@ func read(target *targets.Target, bin string, text bool) (map[string][]Symbol, e func load(target *targets.Target, bin string, text bool) ([]elf.Symbol, error) { file, err := elf.Open(bin) if err != nil { - return nil, fmt.Errorf("failed to open ELF file %v: %v", bin, err) + return nil, fmt.Errorf("failed to open ELF file %v: %w", bin, err) } allSymbols, err := file.Symbols() if err != nil { - return nil, fmt.Errorf("failed to read ELF symbols: %v", err) + return nil, fmt.Errorf("failed to read ELF symbols: %w", err) } var symbols []elf.Symbol for _, symb := range allSymbols { diff --git a/pkg/symbolizer/symbolizer.go b/pkg/symbolizer/symbolizer.go index 8cf6c8cf1..fb378d09f 100644 --- a/pkg/symbolizer/symbolizer.go +++ b/pkg/symbolizer/symbolizer.go @@ -74,7 +74,7 @@ func (s *Symbolizer) checkBinSupport(addr2line string) error { cmd.Env = append(os.Environ(), "LC_ALL=C") out, err := cmd.CombinedOutput() if err != nil { - return fmt.Errorf("addr2line execution failed: %s", err) + return fmt.Errorf("addr2line execution failed: %w", err) } if !bytes.Contains(out, []byte("supported targets:")) { return fmt.Errorf("addr2line output didn't contain supported targets") @@ -174,7 +174,7 @@ func symbolize(input *bufio.Writer, scanner *bufio.Scanner, pcs []uint64) ([]Fra func parse(s *bufio.Scanner) ([]Frame, error) { pc, err := strconv.ParseUint(s.Text(), 0, 64) if err != nil { - return nil, fmt.Errorf("failed to parse pc '%v' in addr2line output: %v", s.Text(), err) + return nil, fmt.Errorf("failed to parse pc '%v' in addr2line output: %w", s.Text(), err) } var frames []Frame for { @@ -191,7 +191,7 @@ func parse(s *bufio.Scanner) ([]Frame, error) { if err == nil { err = io.EOF } - return nil, fmt.Errorf("failed to read file:line from addr2line: %v", err) + return nil, fmt.Errorf("failed to read file:line from addr2line: %w", err) } ln = s.Text() colon := strings.LastIndexByte(ln, ':') diff --git a/pkg/tool/flags.go b/pkg/tool/flags.go index 93616f17b..ec0d3015f 100644 --- a/pkg/tool/flags.go +++ b/pkg/tool/flags.go @@ -75,11 +75,11 @@ func deserializeFlags(value string) ([]Flag, error) { } name, err := flagUnescape(arg[:eq]) if err != nil { - return nil, fmt.Errorf("failed to parse flags %q: %v", value, err) + return nil, fmt.Errorf("failed to parse flags %q: %w", value, err) } value, err := flagUnescape(arg[eq+1:]) if err != nil { - return nil, fmt.Errorf("failed to parse flags %q: %v", value, err) + return nil, fmt.Errorf("failed to parse flags %q: %w", value, err) } flags = append(flags, Flag{name, value}) } diff --git a/pkg/vcs/fuchsia.go b/pkg/vcs/fuchsia.go index 83f859aa0..bf1bedd9f 100644 --- a/pkg/vcs/fuchsia.go +++ b/pkg/vcs/fuchsia.go @@ -38,11 +38,11 @@ func (ctx *fuchsia) Poll(repo, branch string) (*Commit, error) { func (ctx *fuchsia) initRepo() error { if err := os.RemoveAll(ctx.dir); err != nil { - return fmt.Errorf("failed to remove repo dir: %v", err) + return fmt.Errorf("failed to remove repo dir: %w", err) } tmpDir := ctx.dir + ".tmp" if err := osutil.MkdirAll(tmpDir); err != nil { - return fmt.Errorf("failed to create repo dir: %v", err) + return fmt.Errorf("failed to create repo dir: %w", err) } defer os.RemoveAll(tmpDir) if err := osutil.SandboxChown(tmpDir); err != nil { diff --git a/pkg/vcs/git.go b/pkg/vcs/git.go index 3d5b3ca2f..e1682afb0 100644 --- a/pkg/vcs/git.go +++ b/pkg/vcs/git.go @@ -202,10 +202,10 @@ func (git *git) initRepo(reason error) error { log.Logf(1, "git: initializing repo at %v: %v", git.dir, reason) } if err := os.RemoveAll(git.dir); err != nil { - return fmt.Errorf("failed to remove repo dir: %v", err) + return fmt.Errorf("failed to remove repo dir: %w", err) } if err := osutil.MkdirAll(git.dir); err != nil { - return fmt.Errorf("failed to create repo dir: %v", err) + return fmt.Errorf("failed to create repo dir: %w", err) } if git.sandbox { if err := osutil.SandboxChown(git.dir); err != nil { @@ -243,11 +243,11 @@ func gitParseCommit(output, user, domain []byte, ignoreCC map[string]bool) (*Com const dateFormat = "Mon Jan 2 15:04:05 2006 -0700" date, err := time.Parse(dateFormat, string(lines[4])) if err != nil { - return nil, fmt.Errorf("failed to parse date in git log output: %v\n%q", err, output) + return nil, fmt.Errorf("failed to parse date in git log output: %w\n%q", err, output) } commitDate, err := time.Parse(dateFormat, string(lines[6])) if err != nil { - return nil, fmt.Errorf("failed to parse date in git log output: %v\n%q", err, output) + return nil, fmt.Errorf("failed to parse date in git log output: %w\n%q", err, output) } recipients := make(map[string]bool) recipients[strings.ToLower(string(lines[2]))] = true @@ -375,7 +375,7 @@ func (git *git) ListCommitHashes(baseCommit string) ([]string, error) { func (git *git) ExtractFixTagsFromCommits(baseCommit, email string) ([]*Commit, error) { user, domain, err := splitEmail(email) if err != nil { - return nil, fmt.Errorf("failed to parse email %q: %v", email, err) + return nil, fmt.Errorf("failed to parse email %q: %w", email, err) } grep := user + "+.*" + domain since := time.Now().Add(-time.Hour * 24 * 365 * fetchCommitsMaxAgeInYears).Format("01-02-2006") diff --git a/pkg/vcs/linux.go b/pkg/vcs/linux.go index 589c300b8..ed4efa08b 100644 --- a/pkg/vcs/linux.go +++ b/pkg/vcs/linux.go @@ -305,7 +305,7 @@ func (ctx *linux) Minimize(target *targets.Target, original, baseline []byte, ty } kconf, err := kconfig.Parse(target, filepath.Join(ctx.git.dir, "Kconfig")) if err != nil { - return nil, fmt.Errorf("failed to parse Kconfig: %v", err) + return nil, fmt.Errorf("failed to parse Kconfig: %w", err) } config, err := kconfig.ParseConfigData(original, "original") if err != nil { diff --git a/prog/encoding.go b/prog/encoding.go index bd2efb836..5a2c564e7 100644 --- a/prog/encoding.go +++ b/prog/encoding.go @@ -465,7 +465,7 @@ func (p *parser) parseArgInt(typ Type, dir Dir) (Arg, error) { val := p.Ident() v, err := strconv.ParseUint(val, 0, 64) if err != nil { - return nil, fmt.Errorf("wrong arg value '%v': %v", val, err) + return nil, fmt.Errorf("wrong arg value '%v': %w", val, err) } switch typ.(type) { case *ConstType, *IntType, *FlagsType, *ProcType, *CsumType: @@ -985,7 +985,7 @@ func (p *parser) deserializeData() ([]byte, bool, error) { p.Parse('"') decoded, err := image.DecodeB64(rawData) if err != nil { - return nil, false, fmt.Errorf("data arg is corrupt: %v", err) + return nil, false, fmt.Errorf("data arg is corrupt: %w", err) } return decoded, true, nil } diff --git a/prog/validation.go b/prog/validation.go index 06275299a..f573d497b 100644 --- a/prog/validation.go +++ b/prog/validation.go @@ -38,7 +38,7 @@ func (p *Prog) validate() error { return fmt.Errorf("call does not have meta information") } if err := ctx.validateCall(c); err != nil { - return fmt.Errorf("call %v: %v", c.Meta.Name, err) + return fmt.Errorf("call %v: %w", c.Meta.Name, err) } } for u, orig := range ctx.uses { diff --git a/sys/syz-extract/extract.go b/sys/syz-extract/extract.go index adcb1d0ac..e391a6654 100644 --- a/sys/syz-extract/extract.go +++ b/sys/syz-extract/extract.go @@ -193,7 +193,7 @@ func createArches(OS string, archArray, files []string) ([]*Arch, int, error) { if *flagBuild { dir, err := os.MkdirTemp("", "syzkaller-kernel-build") if err != nil { - return nil, 0, fmt.Errorf("failed to create temp dir: %v", err) + return nil, 0, fmt.Errorf("failed to create temp dir: %w", err) } buildDir = dir } else if *flagBuildDir != "" { diff --git a/sys/syz-extract/fetch.go b/sys/syz-extract/fetch.go index dd5123b31..a7a0e46fe 100644 --- a/sys/syz-extract/fetch.go +++ b/sys/syz-extract/fetch.go @@ -70,7 +70,7 @@ func extract(info *compiler.ConstInfo, cc string, args []string, params *extract } } if !tryAgain { - return nil, nil, fmt.Errorf("failed to run compiler: %v %v\n%v\n%s", + return nil, nil, fmt.Errorf("failed to run compiler: %v %v\n%w\n%s", cc, args, err, out) } data.Values = nil @@ -121,7 +121,7 @@ type CompileData struct { func compile(cc string, args []string, data *CompileData) (string, []byte, error) { src := new(bytes.Buffer) if err := srcTemplate.Execute(src, data); err != nil { - return "", nil, fmt.Errorf("failed to generate source: %v", err) + return "", nil, fmt.Errorf("failed to generate source: %w", err) } binFile, err := osutil.TempFile("syz-extract-bin") if err != nil { @@ -147,7 +147,7 @@ func compile(cc string, args []string, data *CompileData) (string, []byte, error func extractFromExecutable(binFile string) ([]uint64, error) { out, err := osutil.Command(binFile).CombinedOutput() if err != nil { - return nil, fmt.Errorf("failed to run flags binary: %v\n%s", err, out) + return nil, fmt.Errorf("failed to run flags binary: %w\n%s", err, out) } if len(out) == 0 { return nil, nil @@ -156,7 +156,7 @@ func extractFromExecutable(binFile string) ([]uint64, error) { for _, val := range strings.Split(string(out), " ") { n, err := strconv.ParseUint(val, 10, 64) if err != nil { - return nil, fmt.Errorf("failed to parse value: %v (%v)", err, val) + return nil, fmt.Errorf("failed to parse value: %w (%v)", err, val) } vals = append(vals, n) } diff --git a/sys/syz-extract/freebsd.go b/sys/syz-extract/freebsd.go index 2660e832c..99f74d636 100644 --- a/sys/syz-extract/freebsd.go +++ b/sys/syz-extract/freebsd.go @@ -34,11 +34,11 @@ func (*freebsd) prepareArch(arch *Arch) error { if err := os.Symlink(filepath.Join(arch.sourceDir, "sys", archName, "include"), filepath.Join(arch.buildDir, "machine")); err != nil { - return fmt.Errorf("failed to create link: %v", err) + return fmt.Errorf("failed to create link: %w", err) } if err := os.Symlink(filepath.Join(arch.sourceDir, "sys", "x86", "include"), filepath.Join(arch.buildDir, "x86")); err != nil { - return fmt.Errorf("failed to create link: %v", err) + return fmt.Errorf("failed to create link: %w", err) } return nil } diff --git a/sys/syz-extract/linux.go b/sys/syz-extract/linux.go index 086c2d64b..4ba940ef4 100644 --- a/sys/syz-extract/linux.go +++ b/sys/syz-extract/linux.go @@ -33,7 +33,7 @@ func (*linux) prepare(sourcedir string, build bool, arches []*Arch) error { out, err := osutil.RunCmd(time.Hour, sourcedir, "make", "mrproper", "ARCH="+arch, "-j", fmt.Sprint(runtime.NumCPU())) if err != nil { - return fmt.Errorf("make mrproper failed: %v\n%s", err, out) + return fmt.Errorf("make mrproper failed: %w\n%s", err, out) } } } @@ -82,7 +82,7 @@ func (*linux) prepareArch(arch *Arch) error { makeArgs := build.LinuxMakeArgs(arch.target, "", "", "", arch.buildDir) out, err := osutil.RunCmd(time.Hour, kernelDir, "make", append(makeArgs, "defconfig")...) if err != nil { - return fmt.Errorf("make defconfig failed: %v\n%s", err, out) + return fmt.Errorf("make defconfig failed: %w\n%s", err, out) } _, err = osutil.RunCmd(time.Minute, arch.buildDir, filepath.Join(kernelDir, "scripts", "config"), // powerpc arch is configured to be big-endian by default, but we want little-endian powerpc. @@ -106,11 +106,11 @@ func (*linux) prepareArch(arch *Arch) error { } out, err = osutil.RunCmd(time.Hour, kernelDir, "make", append(makeArgs, "olddefconfig")...) if err != nil { - return fmt.Errorf("make olddefconfig failed: %v\n%s", err, out) + return fmt.Errorf("make olddefconfig failed: %w\n%s", err, out) } out, err = osutil.RunCmd(time.Hour, kernelDir, "make", append(makeArgs, "init/main.o")...) if err != nil { - return fmt.Errorf("make failed: %v\n%s", err, out) + return fmt.Errorf("make failed: %w\n%s", err, out) } return nil } diff --git a/sys/syz-extract/netbsd.go b/sys/syz-extract/netbsd.go index 8f86cd5d5..8cc5efac0 100644 --- a/sys/syz-extract/netbsd.go +++ b/sys/syz-extract/netbsd.go @@ -38,7 +38,7 @@ func (*netbsd) prepareArch(arch *Arch) error { func machineLink(arch *Arch, machine, dest string) error { if err := os.Symlink(machineInclude(arch, machine), filepath.Join(arch.buildDir, dest)); err != nil { - return fmt.Errorf("failed to create link: %v", err) + return fmt.Errorf("failed to create link: %w", err) } return nil } diff --git a/sys/syz-extract/openbsd.go b/sys/syz-extract/openbsd.go index 5f7036356..f103d1949 100644 --- a/sys/syz-extract/openbsd.go +++ b/sys/syz-extract/openbsd.go @@ -24,11 +24,11 @@ func (*openbsd) prepare(sourcedir string, build bool, arches []*Arch) error { func (*openbsd) prepareArch(arch *Arch) error { if err := os.Symlink(filepath.Join(arch.sourceDir, "sys", "arch", "amd64", "include"), filepath.Join(arch.buildDir, "amd64")); err != nil { - return fmt.Errorf("failed to create link: %v", err) + return fmt.Errorf("failed to create link: %w", err) } if err := os.Symlink(filepath.Join(arch.sourceDir, "sys", "arch", "amd64", "include"), filepath.Join(arch.buildDir, "machine")); err != nil { - return fmt.Errorf("failed to create link: %v", err) + return fmt.Errorf("failed to create link: %w", err) } return nil } diff --git a/syz-ci/jobs.go b/syz-ci/jobs.go index 4c10fc7b7..203a7a8e3 100644 --- a/syz-ci/jobs.go +++ b/syz-ci/jobs.go @@ -255,10 +255,10 @@ func (jp *JobProcessor) pollRepo(mgr *Manager, URL, branch, reportEmail string) dir := filepath.Join(jp.baseDir, mgr.managercfg.TargetOS, "kernel") repo, err := vcs.NewRepo(mgr.managercfg.TargetOS, mgr.managercfg.Type, dir) if err != nil { - return nil, fmt.Errorf("failed to create kernel repo: %v", err) + return nil, fmt.Errorf("failed to create kernel repo: %w", err) } if _, err = repo.CheckoutBranch(URL, branch); err != nil { - return nil, fmt.Errorf("failed to checkout kernel repo %v/%v: %v", URL, branch, err) + return nil, fmt.Errorf("failed to checkout kernel repo %v/%v: %w", URL, branch, err) } return repo.ExtractFixTagsFromCommits("HEAD", reportEmail) } @@ -267,10 +267,10 @@ func (jp *JobProcessor) getCommitInfo(mgr *Manager, URL, branch string, commits dir := filepath.Join(jp.baseDir, mgr.managercfg.TargetOS, "kernel") repo, err := vcs.NewRepo(mgr.managercfg.TargetOS, mgr.managercfg.Type, dir) if err != nil { - return nil, fmt.Errorf("failed to create kernel repo: %v", err) + return nil, fmt.Errorf("failed to create kernel repo: %w", err) } if _, err = repo.CheckoutBranch(URL, branch); err != nil { - return nil, fmt.Errorf("failed to checkout kernel repo %v/%v: %v", URL, branch, err) + return nil, fmt.Errorf("failed to checkout kernel repo %v/%v: %w", URL, branch, err) } results, missing, err := repo.GetCommitsByTitles(commits) if err != nil { @@ -456,7 +456,7 @@ func (jp *JobProcessor) bisect(job *Job, mgrcfg *mgrconfig.Config) error { var err error baseline, err = os.ReadFile(mgr.mgrcfg.KernelBaselineConfig) if err != nil { - return fmt.Errorf("failed to read baseline config: %v", err) + return fmt.Errorf("failed to read baseline config: %w", err) } } trace := new(bytes.Buffer) @@ -590,7 +590,7 @@ func (jp *JobProcessor) testPatch(job *Job, mgrcfg *mgrconfig.Config) error { jp.Logf(0, "fetching kernel...") repo, err := vcs.NewRepo(mgrcfg.TargetOS, mgrcfg.Type, mgrcfg.KernelSrc) if err != nil { - return fmt.Errorf("failed to create kernel repo: %v", err) + return fmt.Errorf("failed to create kernel repo: %w", err) } kernelCommit, err := jp.checkoutJobCommit(job, repo) if err != nil { @@ -601,7 +601,7 @@ func (jp *JobProcessor) testPatch(job *Job, mgrcfg *mgrconfig.Config) error { resp.Build.KernelCommitDate = kernelCommit.CommitDate if err := build.Clean(mgrcfg.TargetOS, mgrcfg.TargetVMArch, mgrcfg.Type, mgrcfg.KernelSrc); err != nil { - return fmt.Errorf("kernel clean failed: %v", err) + return fmt.Errorf("kernel clean failed: %w", err) } if len(req.Patch) != 0 { if err := vcs.Patch(mgrcfg.KernelSrc, req.Patch); err != nil { @@ -637,7 +637,7 @@ func (jp *JobProcessor) testPatch(job *Job, mgrcfg *mgrconfig.Config) error { if kernelConfig != "" { resp.Build.KernelConfig, err = os.ReadFile(kernelConfig) if err != nil { - return fmt.Errorf("failed to read config file: %v", err) + return fmt.Errorf("failed to read config file: %w", err) } } jp.Logf(0, "job: testing...") @@ -666,17 +666,17 @@ func (jp *JobProcessor) checkoutJobCommit(job *Job, repo vcs.Repo) (*vcs.Commit, jp.Logf(1, "checking out the base kernel...") firstCommit, err := checkoutKernelOrCommit(repo, req.KernelRepo, req.KernelBranch) if err != nil { - return nil, fmt.Errorf("failed to checkout first kernel repo %v on %v: %v", + return nil, fmt.Errorf("failed to checkout first kernel repo %v on %v: %w", req.KernelRepo, req.KernelBranch, err) } secondCommit, err := checkoutKernelOrCommit(repo, req.MergeBaseRepo, req.MergeBaseBranch) if err != nil { - return nil, fmt.Errorf("failed to checkout second kernel repo %v on %v: %v", + return nil, fmt.Errorf("failed to checkout second kernel repo %v on %v: %w", req.MergeBaseRepo, req.MergeBaseBranch, err) } bases, err := repo.MergeBases(firstCommit.Hash, secondCommit.Hash) if err != nil { - return nil, fmt.Errorf("failed to calculate merge bases between %v and %v: %v", + return nil, fmt.Errorf("failed to calculate merge bases between %v and %v: %w", firstCommit.Hash, secondCommit.Hash, err) } if len(bases) != 1 { @@ -685,7 +685,7 @@ func (jp *JobProcessor) checkoutJobCommit(job *Job, repo vcs.Repo) (*vcs.Commit, } kernelCommit, err = repo.CheckoutCommit(req.KernelRepo, bases[0].Hash) if err != nil { - return nil, fmt.Errorf("failed to checkout kernel repo %v on merge base %v: %v", + return nil, fmt.Errorf("failed to checkout kernel repo %v on merge base %v: %w", req.KernelRepo, bases[0].Hash, err) } resp.Build.KernelBranch = "" @@ -693,7 +693,7 @@ func (jp *JobProcessor) checkoutJobCommit(job *Job, repo vcs.Repo) (*vcs.Commit, var err error kernelCommit, err = repo.CheckoutCommit(req.KernelRepo, req.KernelBranch) if err != nil { - return nil, fmt.Errorf("failed to checkout kernel repo %v on commit %v: %v", + return nil, fmt.Errorf("failed to checkout kernel repo %v on commit %v: %w", req.KernelRepo, req.KernelBranch, err) } resp.Build.KernelBranch = "" @@ -701,7 +701,7 @@ func (jp *JobProcessor) checkoutJobCommit(job *Job, repo vcs.Repo) (*vcs.Commit, var err error kernelCommit, err = repo.CheckoutBranch(req.KernelRepo, req.KernelBranch) if err != nil { - return nil, fmt.Errorf("failed to checkout kernel repo %v/%v: %v", + return nil, fmt.Errorf("failed to checkout kernel repo %v/%v: %w", req.KernelRepo, req.KernelBranch, err) } } diff --git a/syz-ci/manager.go b/syz-ci/manager.go index 7ec7ba1cc..14dd6114c 100644 --- a/syz-ci/manager.go +++ b/syz-ci/manager.go @@ -313,10 +313,10 @@ func (mgr *Manager) build(kernelCommit *vcs.Commit) error { // We first form the whole image in tmp dir and then rename it to latest. tmpDir := mgr.latestDir + ".tmp" if err := os.RemoveAll(tmpDir); err != nil { - return fmt.Errorf("failed to remove tmp dir: %v", err) + return fmt.Errorf("failed to remove tmp dir: %w", err) } if err := osutil.MkdirAll(tmpDir); err != nil { - return fmt.Errorf("failed to create tmp dir: %v", err) + return fmt.Errorf("failed to create tmp dir: %w", err) } params := build.Params{ TargetOS: mgr.managercfg.TargetOS, @@ -353,11 +353,11 @@ func (mgr *Manager) build(kernelCommit *vcs.Commit) error { if err := mgr.reportBuildError(rep, info, tmpDir); err != nil { mgr.Errorf("failed to report image error: %v", err) } - return fmt.Errorf("kernel build failed: %v", err) + return fmt.Errorf("kernel build failed: %w", err) } if err := config.SaveFile(filepath.Join(tmpDir, "tag"), info); err != nil { - return fmt.Errorf("failed to write tag file: %v", err) + return fmt.Errorf("failed to write tag file: %w", err) } if err := mgr.testImage(tmpDir, info); err != nil { @@ -366,7 +366,7 @@ func (mgr *Manager) build(kernelCommit *vcs.Commit) error { // Now try to replace latest with our tmp dir as atomically as we can get on Linux. if err := os.RemoveAll(mgr.latestDir); err != nil { - return fmt.Errorf("failed to remove latest dir: %v", err) + return fmt.Errorf("failed to remove latest dir: %w", err) } return osutil.Rename(tmpDir, mgr.latestDir) } @@ -412,7 +412,7 @@ func (mgr *Manager) testImage(imageDir string, info *BuildInfo) error { log.Logf(0, "%v: testing image...", mgr.name) mgrcfg, err := mgr.createTestConfig(imageDir, info) if err != nil { - return fmt.Errorf("failed to create manager config: %v", err) + return fmt.Errorf("failed to create manager config: %w", err) } defer os.RemoveAll(mgrcfg.Workdir) if !vm.AllowsOvercommit(mgrcfg.Type) { @@ -455,9 +455,9 @@ func (mgr *Manager) testImage(imageDir string, info *BuildInfo) error { } } if err.Boot { - failureErr = fmt.Errorf("VM boot failed with: %v", err) + failureErr = fmt.Errorf("VM boot failed with: %w", err) } else { - failureErr = fmt.Errorf("VM testing failed with: %v", err) + failureErr = fmt.Errorf("VM testing failed with: %w", err) } default: failureErr = res.Error @@ -520,7 +520,7 @@ func (mgr *Manager) createTestConfig(imageDir string, info *BuildInfo) (*mgrconf } mgrcfg.KernelSrc = mgr.kernelDir if err := mgrconfig.Complete(mgrcfg); err != nil { - return nil, fmt.Errorf("bad manager config: %v", err) + return nil, fmt.Errorf("bad manager config: %w", err) } return mgrcfg, nil } @@ -557,7 +557,7 @@ func (mgr *Manager) writeConfig(buildTag string) (string, error) { // problems, we need to make a copy of sources after build. mgrcfg.KernelSrc = mgr.kernelDir if err := mgrconfig.Complete(mgrcfg); err != nil { - return "", fmt.Errorf("bad manager config: %v", err) + return "", fmt.Errorf("bad manager config: %w", err) } configFile := filepath.Join(mgr.currentDir, "manager.cfg") if err := config.SaveFile(configFile, mgrcfg); err != nil { @@ -611,7 +611,7 @@ func (mgr *Manager) createDashboardBuild(info *BuildInfo, imageDir, typ string) if kernelConfigFile := filepath.Join(imageDir, "kernel.config"); osutil.IsExist(kernelConfigFile) { var err error if kernelConfig, err = os.ReadFile(kernelConfigFile); err != nil { - return nil, fmt.Errorf("failed to read kernel.config: %v", err) + return nil, fmt.Errorf("failed to read kernel.config: %w", err) } } // Resulting build depends on both kernel build tag and syzkaller commmit. @@ -787,7 +787,7 @@ func (mgr *Manager) uploadCoverReport() error { } resp, err := client.Get(fmt.Sprintf("http://%v/cover", addr)) if err != nil { - return fmt.Errorf("failed to get report: %v", err) + return fmt.Errorf("failed to get report: %w", err) } defer resp.Body.Close() if directUpload { @@ -818,7 +818,7 @@ func (mgr *Manager) uploadCorpus() error { func (mgr *Manager) uploadFile(dstPath, name string, file io.Reader) error { URL, err := url.Parse(dstPath) if err != nil { - return fmt.Errorf("failed to parse upload path: %v", err) + return fmt.Errorf("failed to parse upload path: %w", err) } URL.Path = path.Join(URL.Path, name) URLStr := URL.String() @@ -837,19 +837,19 @@ func (mgr *Manager) uploadFile(dstPath, name string, file io.Reader) error { func uploadFileGCS(URL string, file io.Reader, publish bool) error { GCS, err := gcs.NewClient() if err != nil { - return fmt.Errorf("failed to create GCS client: %v", err) + return fmt.Errorf("failed to create GCS client: %w", err) } defer GCS.Close() gcsWriter, err := GCS.FileWriter(URL) if err != nil { - return fmt.Errorf("failed to create GCS writer: %v", err) + return fmt.Errorf("failed to create GCS writer: %w", err) } if _, err := io.Copy(gcsWriter, file); err != nil { gcsWriter.Close() - return fmt.Errorf("failed to copy report: %v", err) + return fmt.Errorf("failed to copy report: %w", err) } if err := gcsWriter.Close(); err != nil { - return fmt.Errorf("failed to close gcs writer: %v", err) + return fmt.Errorf("failed to close gcs writer: %w", err) } if publish { return GCS.Publish(URL) @@ -860,12 +860,12 @@ func uploadFileGCS(URL string, file io.Reader, publish bool) error { func uploadFileHTTPPut(URL string, file io.Reader) error { req, err := http.NewRequest(http.MethodPut, URL, file) if err != nil { - return fmt.Errorf("failed to create HTTP PUT request: %v", err) + return fmt.Errorf("failed to create HTTP PUT request: %w", err) } client := &http.Client{} resp, err := client.Do(req) if err != nil { - return fmt.Errorf("failed to perform HTTP PUT request: %v", err) + return fmt.Errorf("failed to perform HTTP PUT request: %w", err) } defer resp.Body.Close() if !(resp.StatusCode >= 200 && resp.StatusCode <= 299) { diff --git a/syz-ci/syz-ci.go b/syz-ci/syz-ci.go index 94b574360..e30e59929 100644 --- a/syz-ci/syz-ci.go +++ b/syz-ci/syz-ci.go @@ -391,7 +391,7 @@ func loadConfig(filename string) (*Config, error) { func loadManagerConfig(cfg *Config, mgr *ManagerConfig) error { managercfg, err := mgrconfig.LoadPartialData(mgr.ManagerConfig) if err != nil { - return fmt.Errorf("manager config: %v", err) + return fmt.Errorf("manager config: %w", err) } if managercfg.Name != "" && mgr.Name != "" { return fmt.Errorf("both managercfg.Name=%q and mgr.Name=%q are specified", managercfg.Name, mgr.Name) diff --git a/syz-ci/updater.go b/syz-ci/updater.go index bade54333..1d632ddcd 100644 --- a/syz-ci/updater.go +++ b/syz-ci/updater.go @@ -227,7 +227,7 @@ func (upd *SyzUpdater) build(commit *vcs.Commit) error { if upd.descriptions != "" { files, err := os.ReadDir(upd.descriptions) if err != nil { - return fmt.Errorf("failed to read descriptions dir: %v", err) + return fmt.Errorf("failed to read descriptions dir: %w", err) } for _, f := range files { src := filepath.Join(upd.descriptions, f.Name()) @@ -286,10 +286,10 @@ func (upd *SyzUpdater) build(commit *vcs.Commit) error { } tagFile := filepath.Join(upd.syzkallerDir, "tag") if err := osutil.WriteFile(tagFile, []byte(commit.Hash)); err != nil { - return fmt.Errorf("failed to write tag file: %v", err) + return fmt.Errorf("failed to write tag file: %w", err) } if err := osutil.CopyFiles(upd.syzkallerDir, upd.latestDir, upd.syzFiles); err != nil { - return fmt.Errorf("failed to copy syzkaller: %v", err) + return fmt.Errorf("failed to copy syzkaller: %w", err) } return nil } diff --git a/syz-fuzzer/testing.go b/syz-fuzzer/testing.go index 49f2d1ce6..4a8fc7e93 100644 --- a/syz-fuzzer/testing.go +++ b/syz-fuzzer/testing.go @@ -126,7 +126,7 @@ func checkMachine(args *checkArgs) (*rpctype.CheckArgs, error) { } globFiles, err := host.CollectGlobsInfo(args.target.GetGlobs()) if err != nil { - return nil, fmt.Errorf("failed to collect glob info: %v", err) + return nil, fmt.Errorf("failed to collect glob info: %w", err) } // TODO: make host.DetectSupportedSyscalls below filter out globs with no values. // Also make prog package more strict with respect to generation/mutation of globs @@ -217,7 +217,7 @@ func checkRevisions(args *checkArgs) error { } out, err := osutil.Run(time.Minute, cmd) if err != nil { - return fmt.Errorf("failed to run executor version: %v", err) + return fmt.Errorf("failed to run executor version: %w", err) } vers := strings.Split(strings.TrimSpace(string(out)), " ") if len(vers) != 4 { @@ -248,17 +248,17 @@ func checkRevisions(args *checkArgs) error { func checkSimpleProgram(args *checkArgs, features *host.Features) error { log.Logf(0, "testing simple program...") if err := host.Setup(args.target, features, args.featureFlags, args.ipcConfig.Executor); err != nil { - return fmt.Errorf("host setup failed: %v", err) + return fmt.Errorf("host setup failed: %w", err) } env, err := ipc.MakeEnv(args.ipcConfig, 0) if err != nil { - return fmt.Errorf("failed to create ipc env: %v", err) + return fmt.Errorf("failed to create ipc env: %w", err) } defer env.Close() p := args.target.DataMmapProg() output, info, hanged, err := env.Exec(args.ipcExecOpts, p) if err != nil { - return fmt.Errorf("program execution failed: %v\n%s", err, output) + return fmt.Errorf("program execution failed: %w\n%s", err, output) } if hanged { return fmt.Errorf("program hanged:\n%s", output) @@ -297,7 +297,7 @@ func buildCallList(target *prog.Target, enabledCalls []int, sandbox string) ( _, unsupported, err := host.DetectSupportedSyscalls(target, sandbox, calls) if err != nil { - return nil, nil, fmt.Errorf("failed to detect host supported syscalls: %v", err) + return nil, nil, fmt.Errorf("failed to detect host supported syscalls: %w", err) } for c := range calls { if reason, ok := unsupported[c]; ok { diff --git a/syz-hub/state/state.go b/syz-hub/state/state.go index d5a6183b4..37bdb2b59 100644 --- a/syz-hub/state/state.go +++ b/syz-hub/state/state.go @@ -74,7 +74,7 @@ func Make(dir string) (*State, error) { osutil.MkdirAll(managersDir) managers, err := os.ReadDir(managersDir) if err != nil { - return nil, fmt.Errorf("failed to read %v dir: %v", managersDir, err) + return nil, fmt.Errorf("failed to read %v dir: %w", managersDir, err) } for _, manager := range managers { _, err := st.createManager(manager.Name()) @@ -103,7 +103,7 @@ func loadDB(file, name string, progs bool) (*db.DB, uint64, error) { log.Logf(0, "reading %v...", name) db, err := db.Open(file, true) if err != nil { - return nil, 0, fmt.Errorf("failed to open %v database: %v", name, err) + return nil, 0, fmt.Errorf("failed to open %v database: %w", name, err) } log.Logf(0, "read %v programs", len(db.Records)) var maxSeq uint64 @@ -131,7 +131,7 @@ func loadDB(file, name string, progs bool) (*db.DB, uint64, error) { } } if err := db.Flush(); err != nil { - return nil, 0, fmt.Errorf("failed to flush corpus database: %v", err) + return nil, 0, fmt.Errorf("failed to flush corpus database: %w", err) } return db, maxSeq, nil } @@ -162,7 +162,7 @@ func (st *State) createManager(name string) (*Manager, error) { mgr.Domain = string(domainData) corpus, _, err := loadDB(mgr.corpusFile, name, false) if err != nil { - return nil, fmt.Errorf("failed to open manager corpus %v: %v", mgr.corpusFile, err) + return nil, fmt.Errorf("failed to open manager corpus %v: %w", mgr.corpusFile, err) } mgr.Corpus = corpus log.Logf(0, "created manager %v: domain=%v corpus=%v, corpusSeq=%v, reproSeq=%v", @@ -276,7 +276,7 @@ func (st *State) PendingRepro(name string) ([]byte, error) { } calls, _, err := prog.CallSet(rec.Val) if err != nil { - return nil, fmt.Errorf("failed to extract call set: %v\nprogram: %s", err, rec.Val) + return nil, fmt.Errorf("failed to extract call set: %w\nprogram: %s", err, rec.Val) } if !managerSupportsAllCalls(mgr.Calls, calls) { continue @@ -316,7 +316,7 @@ func (st *State) pendingInputs(mgr *Manager) ([]rpctype.HubInput, int, error) { } calls, _, err := prog.CallSet(rec.Val) if err != nil { - return nil, 0, fmt.Errorf("failed to extract call set: %v\nprogram: %s", err, rec.Val) + return nil, 0, fmt.Errorf("failed to extract call set: %w\nprogram: %s", err, rec.Val) } if !managerSupportsAllCalls(mgr.Calls, calls) { continue diff --git a/syz-manager/covfilter.go b/syz-manager/covfilter.go index 811689899..5844c4bc3 100644 --- a/syz-manager/covfilter.go +++ b/syz-manager/covfilter.go @@ -104,7 +104,7 @@ func covFilterAddRawPCs(pcs map[uint32]uint32, rawPCsFiles []string) error { for _, f := range rawPCsFiles { rawFile, err := os.Open(f) if err != nil { - return fmt.Errorf("failed to open raw PCs file: %v", err) + return fmt.Errorf("failed to open raw PCs file: %w", err) } defer rawFile.Close() s := bufio.NewScanner(rawFile) @@ -180,7 +180,7 @@ func compileRegexps(regexpStrings []string) ([]*regexp.Regexp, error) { for _, rs := range regexpStrings { r, err := regexp.Compile(rs) if err != nil { - return nil, fmt.Errorf("failed to compile regexp: %v", err) + return nil, fmt.Errorf("failed to compile regexp: %w", err) } regexps = append(regexps, r) } diff --git a/syz-manager/manager.go b/syz-manager/manager.go index 99830d7e2..a08cd3d7a 100644 --- a/syz-manager/manager.go +++ b/syz-manager/manager.go @@ -767,18 +767,18 @@ func (mgr *Manager) runInstance(index int) (*Crash, error) { func (mgr *Manager) runInstanceInner(index int, instanceName string) (*report.Report, []byte, error) { inst, err := mgr.vmPool.Create(index) if err != nil { - return nil, nil, fmt.Errorf("failed to create instance: %v", err) + return nil, nil, fmt.Errorf("failed to create instance: %w", err) } defer inst.Close() fwdAddr, err := inst.Forward(mgr.serv.port) if err != nil { - return nil, nil, fmt.Errorf("failed to setup port forwarding: %v", err) + return nil, nil, fmt.Errorf("failed to setup port forwarding: %w", err) } fuzzerBin, err := inst.Copy(mgr.cfg.FuzzerBin) if err != nil { - return nil, nil, fmt.Errorf("failed to copy binary: %v", err) + return nil, nil, fmt.Errorf("failed to copy binary: %w", err) } // If ExecutorBin is provided, it means that syz-executor is already in the image, @@ -787,7 +787,7 @@ func (mgr *Manager) runInstanceInner(index int, instanceName string) (*report.Re if executorBin == "" { executorBin, err = inst.Copy(mgr.cfg.ExecutorBin) if err != nil { - return nil, nil, fmt.Errorf("failed to copy binary: %v", err) + return nil, nil, fmt.Errorf("failed to copy binary: %w", err) } } @@ -826,7 +826,7 @@ func (mgr *Manager) runInstanceInner(index int, instanceName string) (*report.Re cmd := instance.FuzzerCmd(args) outc, errc, err := inst.Run(mgr.cfg.Timeouts.VMRunningTime, mgr.vmStop, cmd) if err != nil { - return nil, nil, fmt.Errorf("failed to run fuzzer: %v", err) + return nil, nil, fmt.Errorf("failed to run fuzzer: %w", err) } var vmInfo []byte diff --git a/tools/syz-check/check.go b/tools/syz-check/check.go index 7f86c2d41..6a0b4378b 100644 --- a/tools/syz-check/check.go +++ b/tools/syz-check/check.go @@ -446,7 +446,7 @@ func checkNetlinkStruct(locs map[string]*ast.Struct, symbols map[string][]symbol binary := make([]byte, symb.Size) addr := symb.Addr - rodata.Addr if _, err := rodata.ReadAt(binary, int64(addr)); err != nil { - return nil, fmt.Errorf("failed to read policy %v (%v) at %v: %v", + return nil, fmt.Errorf("failed to read policy %v (%v) at %v: %w", kernelName, name, symb.Addr, err) } policy := (*[1e6]nlaPolicy)(unsafe.Pointer(&binary[0]))[:symb.Size/int(unsafe.Sizeof(nlaPolicy{}))] diff --git a/tools/syz-imagegen/imagegen.go b/tools/syz-imagegen/imagegen.go index 1fd357f43..d71e19d76 100644 --- a/tools/syz-imagegen/imagegen.go +++ b/tools/syz-imagegen/imagegen.go @@ -737,11 +737,11 @@ func generateImages(target *prog.Target, flagFS string, list bool) ([]*Image, er } files, err := filepath.Glob(filepath.Join("sys", targets.Linux, "test", fs.filePrefix()+"_*")) if err != nil { - return nil, fmt.Errorf("error reading output dir: %v", err) + return nil, fmt.Errorf("error reading output dir: %w", err) } for _, file := range files { if err := os.Remove(file); err != nil { - return nil, fmt.Errorf("error removing output file: %v", err) + return nil, fmt.Errorf("error removing output file: %w", err) } } } @@ -806,7 +806,7 @@ func (img *Image) generateSize() error { // This does not work with runCmd -- sudo does not show password prompt on console. cmd := exec.Command("sudo", os.Args[0], "-populate", img.disk, "-fs", img.fs.Name) if out, err := cmd.CombinedOutput(); err != nil { - return fmt.Errorf("image population failed: %v\n%s", err, out) + return fmt.Errorf("image population failed: %w\n%s", err, out) } } data, err := os.ReadFile(img.disk) @@ -818,16 +818,16 @@ func (img *Image) generateSize() error { // Write out image *with* change of directory. out, err := writeImage(img, data) if err != nil { - return fmt.Errorf("failed to write image: %v", err) + return fmt.Errorf("failed to write image: %w", err) } p, err := img.target.Deserialize(out, prog.Strict) if err != nil { - return fmt.Errorf("failed to deserialize resulting program: %v", err) + return fmt.Errorf("failed to deserialize resulting program: %w", err) } exec := make([]byte, prog.ExecBufferSize) if _, err := p.SerializeForExec(exec); err != nil { - return fmt.Errorf("failed to serialize for execution: %v", err) + return fmt.Errorf("failed to serialize for execution: %w", err) } return osutil.WriteFile(outFile, out) @@ -848,7 +848,7 @@ func populate(disk, fs string) error { } defer os.RemoveAll(dir) if _, err := runCmd("mount", "-t", fs, loop, dir); err != nil { - return fmt.Errorf("%v\n%s", err, output) + return fmt.Errorf("%w\n%s", err, output) } defer runCmd("umount", dir) return populateDir(dir) diff --git a/tools/syz-kconf/kconf.go b/tools/syz-kconf/kconf.go index 8a08f557a..aea31b55c 100644 --- a/tools/syz-kconf/kconf.go +++ b/tools/syz-kconf/kconf.go @@ -96,7 +96,7 @@ func main() { } go func() { if err := ctx.generate(); err != nil { - results <- fmt.Errorf("%v failed:\n%v", ctx.Inst.Name, err) + results <- fmt.Errorf("%v failed:\n%w", ctx.Inst.Name, err) } results <- nil }() @@ -211,14 +211,14 @@ func (ctx *Context) generate() error { } original := cf.Serialize() if err := osutil.WriteFile(configFile, original); err != nil { - return fmt.Errorf("failed to write .config file: %v", err) + return fmt.Errorf("failed to write .config file: %w", err) } // Save what we've got before olddefconfig for debugging purposes, it allows to see if we did not set a config, // or olddefconfig removed it. Save as .tmp so that it's not checked-in accidentially. outputFile := filepath.Join(ctx.ConfigDir, ctx.Inst.Name+".config") outputFileTmp := outputFile + ".tmp" if err := osutil.WriteFile(outputFileTmp, original); err != nil { - return fmt.Errorf("failed to write tmp config file: %v", err) + return fmt.Errorf("failed to write tmp config file: %w", err) } if err := ctx.Make("olddefconfig"); err != nil { return err @@ -228,7 +228,7 @@ func (ctx *Context) generate() error { return err } if err := ctx.verifyConfigs(cf); err != nil { - return fmt.Errorf("%vsaved config before olddefconfig to %v", err, outputFileTmp) + return fmt.Errorf("%w: saved config before olddefconfig to %v", err, outputFileTmp) } if !ctx.Inst.Features[featModules] { cf.ModToNo() @@ -394,11 +394,11 @@ func (ctx *Context) setReleaseFeatures() error { } major, err := strconv.ParseInt(match[1], 10, 32) if err != nil { - return fmt.Errorf("bad release tag %q: %v", tag, err) + return fmt.Errorf("bad release tag %q: %w", tag, err) } minor, err := strconv.ParseInt(match[2], 10, 32) if err != nil { - return fmt.Errorf("bad release tag %q: %v", tag, err) + return fmt.Errorf("bad release tag %q: %w", tag, err) } for ; major >= 2; major-- { for ; minor >= 0; minor-- { diff --git a/tools/syz-kconf/parser.go b/tools/syz-kconf/parser.go index c81525cdf..a37e5f2ed 100644 --- a/tools/syz-kconf/parser.go +++ b/tools/syz-kconf/parser.go @@ -91,13 +91,13 @@ type rawFile struct { func parseMainSpec(file string) ([]*Instance, []string, error) { data, err := os.ReadFile(file) if err != nil { - return nil, nil, fmt.Errorf("failed to read config file: %v", err) + return nil, nil, fmt.Errorf("failed to read config file: %w", err) } dec := yaml.NewDecoder(bytes.NewReader(data)) dec.KnownFields(true) raw := new(rawMain) if err := dec.Decode(raw); err != nil { - return nil, nil, fmt.Errorf("failed to parse %v: %v", file, err) + return nil, nil, fmt.Errorf("failed to parse %v: %w", file, err) } var unusedFeatures []string var instances []*Instance @@ -109,7 +109,7 @@ func parseMainSpec(file string) ([]*Instance, []string, error) { } inst, err := parseInstance(name, filepath.Dir(file), features, raw.Includes) if err != nil { - return nil, nil, fmt.Errorf("%v: %v", name, err) + return nil, nil, fmt.Errorf("%v: %w", name, err) } instances = append(instances, inst) inst, err = parseInstance(name+"-base", filepath.Dir(file), @@ -159,13 +159,13 @@ func parseInstance(name, configDir string, features []string, includes []map[str func parseFile(file string) (*rawFile, error) { data, err := os.ReadFile(file) if err != nil { - return nil, fmt.Errorf("failed to read %v: %v", file, err) + return nil, fmt.Errorf("failed to read %v: %w", file, err) } dec := yaml.NewDecoder(bytes.NewReader(data)) dec.KnownFields(true) raw := new(rawFile) if err := dec.Decode(raw); err != nil { - return nil, fmt.Errorf("failed to parse %v: %v", file, err) + return nil, fmt.Errorf("failed to parse %v: %w", file, err) } return raw, nil } diff --git a/tools/syz-reporter/reporter.go b/tools/syz-reporter/reporter.go index f9d482c6b..6fa4adc47 100644 --- a/tools/syz-reporter/reporter.go +++ b/tools/syz-reporter/reporter.go @@ -92,7 +92,7 @@ func httpSummary(w io.Writer, cfg *mgrconfig.Config) error { var err error if data.Crashes, err = collectCrashes(cfg.Workdir); err != nil { - return fmt.Errorf("failed to collect crashes: %v", err) + return fmt.Errorf("failed to collect crashes: %w", err) } data.CrashCount = len(data.Crashes) @@ -104,7 +104,7 @@ func httpSummary(w io.Writer, cfg *mgrconfig.Config) error { } if err = summaryTemplate.Execute(w, data); err != nil { - return fmt.Errorf("failed to execute template: %v", err) + return fmt.Errorf("failed to execute template: %w", err) } return err diff --git a/tools/syz-reprolist/reprolist.go b/tools/syz-reprolist/reprolist.go index 56313e952..3b0aa94d0 100644 --- a/tools/syz-reprolist/reprolist.go +++ b/tools/syz-reprolist/reprolist.go @@ -137,15 +137,15 @@ func writeRepros(bugchan chan *dashapi.BugReport) { func createCRepro(bug *dashapi.BugReport) error { opts, err := csource.DeserializeOptions(bug.ReproOpts) if err != nil { - return fmt.Errorf("failed to deserialize opts: %v", err) + return fmt.Errorf("failed to deserialize opts: %w", err) } file := filepath.Join(*flagOutputDir, bug.ID+".syz") if err := os.WriteFile(file, bug.ReproSyz, 0644); err != nil { - return fmt.Errorf("failed to write file: %v", err) + return fmt.Errorf("failed to write file: %w", err) } repo := vcs.NewSyzkallerRepo(*flagSyzkallerDir, vcs.OptPrecious) if _, err := repo.SwitchCommit(bug.SyzkallerCommit); err != nil { - return fmt.Errorf("failed to checkout commit %v: %v", bug.SyzkallerCommit, err) + return fmt.Errorf("failed to checkout commit %v: %w", bug.SyzkallerCommit, err) } // At some points we checked-in generated descriptions, at some they are not tracked. // Also, new arches were added. This can cause build breakages when switching diff --git a/tools/syz-runtest/runtest.go b/tools/syz-runtest/runtest.go index c36936056..405b22255 100644 --- a/tools/syz-runtest/runtest.go +++ b/tools/syz-runtest/runtest.go @@ -149,18 +149,18 @@ type Manager struct { func (mgr *Manager) boot(name string, index int) (*report.Report, error) { inst, err := mgr.vmPool.Create(index) if err != nil { - return nil, fmt.Errorf("failed to create instance: %v", err) + return nil, fmt.Errorf("failed to create instance: %w", err) } defer inst.Close() fwdAddr, err := inst.Forward(mgr.port) if err != nil { - return nil, fmt.Errorf("failed to setup port forwarding: %v", err) + return nil, fmt.Errorf("failed to setup port forwarding: %w", err) } fuzzerBin, err := inst.Copy(mgr.cfg.FuzzerBin) if err != nil { - return nil, fmt.Errorf("failed to copy binary: %v", err) + return nil, fmt.Errorf("failed to copy binary: %w", err) } // If SyzExecutorCmd is provided, it means that syz-executor is already in @@ -169,7 +169,7 @@ func (mgr *Manager) boot(name string, index int) (*report.Report, error) { if executorBin == "" { executorBin, err = inst.Copy(mgr.cfg.ExecutorBin) if err != nil { - return nil, fmt.Errorf("failed to copy binary: %v", err) + return nil, fmt.Errorf("failed to copy binary: %w", err) } } args := &instance.FuzzerCmdArgs{ @@ -194,7 +194,7 @@ func (mgr *Manager) boot(name string, index int) (*report.Report, error) { cmd := instance.FuzzerCmd(args) outc, errc, err := inst.Run(time.Hour, mgr.vmStop, cmd) if err != nil { - return nil, fmt.Errorf("failed to run fuzzer: %v", err) + return nil, fmt.Errorf("failed to run fuzzer: %w", err) } rep := inst.MonitorExecution(outc, errc, mgr.reporter, vm.ExitNormal) return rep, nil diff --git a/tools/syz-testbed/checkout.go b/tools/syz-testbed/checkout.go index e28786930..eb7481bef 100644 --- a/tools/syz-testbed/checkout.go +++ b/tools/syz-testbed/checkout.go @@ -101,12 +101,12 @@ func (ctx *TestbedContext) NewCheckout(config *CheckoutConfig, mgrConfig json.Ra repo := vcs.NewSyzkallerRepo(checkout.Path) commit, err := repo.Poll(config.Repo, config.Branch) if err != nil { - return nil, fmt.Errorf("failed to checkout %s (%s): %s", config.Repo, config.Branch, err) + return nil, fmt.Errorf("failed to checkout %s (%s): %w", config.Repo, config.Branch, err) } log.Printf("[%s] Done. Latest commit: %s", checkout.Name, commit) log.Printf("[%s] Building", checkout.Name) if _, err := osutil.RunCmd(time.Hour, checkout.Path, syz_instance.MakeBin); err != nil { - return nil, fmt.Errorf("[%s] Make failed: %s", checkout.Name, err) + return nil, fmt.Errorf("[%s] Make failed: %w", checkout.Name, err) } return checkout, nil } diff --git a/tools/syz-testbed/html.go b/tools/syz-testbed/html.go index 70e20ac0b..679099a8a 100644 --- a/tools/syz-testbed/html.go +++ b/tools/syz-testbed/html.go @@ -192,7 +192,7 @@ func (ctx *TestbedContext) genSimpleTableController(method func(view StatView) ( return func(urlPrefix string, view StatView, r *http.Request) (*uiTable, error) { table, err := method(view) if err != nil { - return nil, fmt.Errorf("table generation failed: %s", err) + return nil, fmt.Errorf("table generation failed: %w", err) } return &uiTable{ Table: table, @@ -208,7 +208,7 @@ func (ctx *TestbedContext) httpMainStatsTable(urlPrefix string, view StatView, r } table, err := view.AlignedStatsTable(alignBy) if err != nil { - return nil, fmt.Errorf("stat table generation failed: %s", err) + return nil, fmt.Errorf("stat table generation failed: %w", err) } baseColumn := r.FormValue("base_column") if baseColumn != "" { diff --git a/tools/syz-testbed/instance.go b/tools/syz-testbed/instance.go index a7b616eb6..2ea3161e3 100644 --- a/tools/syz-testbed/instance.go +++ b/tools/syz-testbed/instance.go @@ -42,7 +42,7 @@ func (inst *InstanceCommon) Run() error { if inst.LogFile != "" { logfile, err := os.Create(inst.LogFile) if err != nil { - return fmt.Errorf("[%s] failed to create logfile: %s", inst.Name, err) + return fmt.Errorf("[%s] failed to create logfile: %w", inst.Name, err) } cmd.Stdout = logfile cmd.Stderr = logfile @@ -120,7 +120,7 @@ func (inst *SyzManagerInstance) Run() error { case err := <-ret: // Syz-managers are not supposed to stop themselves under normal circumstances. // If one of them did stop, there must have been a very good reason to do so. - return fmt.Errorf("[%s] stopped: %v", inst.Name, err) + return fmt.Errorf("[%s] stopped: %w", inst.Name, err) case <-time.After(inst.RunTime): inst.Stop() <-ret @@ -153,7 +153,7 @@ func SetupSyzkallerInstance(mgrName, folder string, checkout *Checkout) (*Syzkal } err = osutil.WriteFile(cfgFile, managerCfg) if err != nil { - return nil, fmt.Errorf("failed to save manager config to %s: %s", cfgFile, err) + return nil, fmt.Errorf("failed to save manager config to %s: %w", cfgFile, err) } return &SyzkallerInfo{ Workdir: workdir, @@ -173,7 +173,7 @@ func (t *SyzManagerTarget) newSyzManagerInstance(slotName, uniqName string, chec corpusPath := filepath.Join(common.Workdir, "corpus.db") err = osutil.CopyFile(t.config.Corpus, corpusPath) if err != nil { - return nil, fmt.Errorf("failed to copy corpus from %s: %s", t.config.Corpus, err) + return nil, fmt.Errorf("failed to copy corpus from %s: %w", t.config.Corpus, err) } } return &SyzManagerInstance{ diff --git a/tools/syz-testbed/targets.go b/tools/syz-testbed/targets.go index 67a359b62..ef0b189a4 100644 --- a/tools/syz-testbed/targets.go +++ b/tools/syz-testbed/targets.go @@ -133,7 +133,7 @@ func (t *SyzManagerTarget) SaveStatView(view StatView, dir string) error { benchDir := filepath.Join(dir, "benches") err := osutil.MkdirAll(benchDir) if err != nil { - return fmt.Errorf("failed to create %s: %s", benchDir, err) + return fmt.Errorf("failed to create %s: %w", benchDir, err) } tableStats := map[string]func(view StatView) (*Table, error){ "bugs.csv": (StatView).GenerateBugTable, @@ -174,7 +174,7 @@ type SyzReproInput struct { func (inp *SyzReproInput) QueryTitle(checkout *Checkout, dupsMap map[string]int) error { data, err := os.ReadFile(inp.Path) if err != nil { - return fmt.Errorf("failed to read: %s", err) + return fmt.Errorf("failed to read: %w", err) } report := checkout.GetReporter().Parse(data) if report == nil { diff --git a/tools/syz-testbed/testbed.go b/tools/syz-testbed/testbed.go index d47ee9e53..2c104ebc3 100644 --- a/tools/syz-testbed/testbed.go +++ b/tools/syz-testbed/testbed.go @@ -205,7 +205,7 @@ func (ctx *TestbedContext) Slot(slotID int, stop chan struct{}, ret chan error) for { checkout, instance, err := ctx.Target.NewJob(slotName, ctx.Checkouts) if err != nil { - ret <- fmt.Errorf("failed to create instance: %s", err) + ret <- fmt.Errorf("failed to create instance: %w", err) return } checkout.AddRunning(instance) @@ -232,7 +232,7 @@ func (ctx *TestbedContext) Slot(slotID int, stop chan struct{}, ret chan error) } err = checkout.ArchiveInstance(instance) if err != nil { - ret <- fmt.Errorf("a call to ArchiveInstance failed: %s", err) + ret <- fmt.Errorf("a call to ArchiveInstance failed: %w", err) return } } diff --git a/vm/adb/adb.go b/vm/adb/adb.go index 96c156130..704bebb27 100644 --- a/vm/adb/adb.go +++ b/vm/adb/adb.go @@ -78,7 +78,7 @@ func loadDevice(data []byte) (*Device, error) { err1 := config.LoadData(data, devObj) err2 := config.LoadData(data, &devStr) if err1 != nil && err2 != nil { - return nil, fmt.Errorf("failed to parse adb vm config: %v %v", err1, err2) + return nil, fmt.Errorf("failed to parse adb vm config: %w %w", err1, err2) } if err2 == nil { devObj.Serial = devStr @@ -93,7 +93,7 @@ func ctor(env *vmimpl.Env) (vmimpl.Pool, error) { TargetReboot: true, } if err := config.LoadData(env.Config, cfg); err != nil { - return nil, fmt.Errorf("failed to parse adb vm config: %v", err) + return nil, fmt.Errorf("failed to parse adb vm config: %w", err) } if _, err := exec.LookPath(cfg.Adb); err != nil { return nil, err @@ -229,7 +229,7 @@ func findConsoleImpl(adb, dev string) (string, error) { // Search all consoles, as described in 'findConsole' consoles, err := filepath.Glob("/dev/ttyUSB*") if err != nil { - return "", fmt.Errorf("failed to list /dev/ttyUSB devices: %v", err) + return "", fmt.Errorf("failed to list /dev/ttyUSB devices: %w", err) } output := make(map[string]*[]byte) errors := make(chan error, len(consoles)) @@ -262,7 +262,7 @@ func findConsoleImpl(adb, dev string) (string, error) { unique := fmt.Sprintf(">>>%v<<<", dev) cmd := osutil.Command(adb, "-s", dev, "shell", "echo", "\"<1>", unique, "\"", ">", "/dev/kmsg") if out, err := cmd.CombinedOutput(); err != nil { - return "", fmt.Errorf("failed to run adb shell: %v\n%s", err, out) + return "", fmt.Errorf("failed to run adb shell: %w\n%s", err, out) } time.Sleep(500 * time.Millisecond) close(done) @@ -411,12 +411,12 @@ func (inst *instance) runScript(script string) error { // Execute the contents of the script. contents, err := os.ReadFile(script) if err != nil { - return fmt.Errorf("unable to read %s: %v", script, err) + return fmt.Errorf("unable to read %s: %w", script, err) } c := string(contents) output, err := osutil.RunCmd(5*time.Minute, "", "sh", "-c", c) if err != nil { - return fmt.Errorf("failed to execute %s: %v", script, err) + return fmt.Errorf("failed to execute %s: %w", script, err) } log.Logf(2, "adb: execute %s output\n%s", script, output) log.Logf(2, "adb: done executing %s", script) @@ -429,7 +429,7 @@ func (inst *instance) waitForSSH() error { } if _, err := inst.adbWithTimeout(10*time.Minute, "wait-for-device"); err != nil { - return fmt.Errorf("instance is dead and unrepairable: %v", err) + return fmt.Errorf("instance is dead and unrepairable: %w", err) } return nil @@ -540,7 +540,7 @@ func (inst *instance) Run(timeout time.Duration, stop <-chan bool, command strin tty.Close() adbRpipe.Close() adbWpipe.Close() - return nil, nil, fmt.Errorf("failed to start adb: %v", err) + return nil, nil, fmt.Errorf("failed to start adb: %w", err) } adbWpipe.Close() diff --git a/vm/bhyve/bhyve.go b/vm/bhyve/bhyve.go index ec0eae81a..cb942f8d6 100644 --- a/vm/bhyve/bhyve.go +++ b/vm/bhyve/bhyve.go @@ -64,7 +64,7 @@ func ctor(env *vmimpl.Env) (vmimpl.Pool, error) { Mem: "512M", } if err := config.LoadData(env.Config, cfg); err != nil { - return nil, fmt.Errorf("failed to parse bhyve vm config: %v", err) + return nil, fmt.Errorf("failed to parse bhyve vm config: %w", err) } if cfg.Count < 1 || cfg.Count > 128 { return nil, fmt.Errorf("invalid config param count: %v, want [1-128]", cfg.Count) diff --git a/vm/cuttlefish/cuttlefish.go b/vm/cuttlefish/cuttlefish.go index 92723d720..48cbcbbe0 100644 --- a/vm/cuttlefish/cuttlefish.go +++ b/vm/cuttlefish/cuttlefish.go @@ -47,7 +47,7 @@ type instance struct { func ctor(env *vmimpl.Env) (vmimpl.Pool, error) { gcePool, err := gce.Ctor(env, consoleReadCmd) if err != nil { - return nil, fmt.Errorf("failed to create underlying GCE pool: %s", err) + return nil, fmt.Errorf("failed to create underlying GCE pool: %w", err) } pool := &Pool{ @@ -65,7 +65,7 @@ func (pool *Pool) Count() int { func (pool *Pool) Create(workdir string, index int) (vmimpl.Instance, error) { gceInst, err := pool.gcePool.Create(workdir, index) if err != nil { - return nil, fmt.Errorf("failed to create underlying gce instance: %s", err) + return nil, fmt.Errorf("failed to create underlying gce instance: %w", err) } inst := &instance{ @@ -80,15 +80,15 @@ func (pool *Pool) Create(workdir string, index int) (vmimpl.Instance, error) { if err := inst.runOnHost(10*time.Minute, fmt.Sprintf("./bin/launch_cvd -daemon -kernel_path=./bzImage -initramfs_path=./initramfs.img"+ " --noenable_sandbox -report_anonymous_usage_stats=n --memory_mb=8192")); err != nil { - return nil, fmt.Errorf("failed to start cuttlefish: %s", err) + return nil, fmt.Errorf("failed to start cuttlefish: %w", err) } if err := inst.runOnHost(10*time.Minute, "adb wait-for-device"); err != nil { - return nil, fmt.Errorf("failed while waiting for device: %s", err) + return nil, fmt.Errorf("failed while waiting for device: %w", err) } if err := inst.runOnHost(5*time.Minute, "adb root"); err != nil { - return nil, fmt.Errorf("failed to get root access to device: %s", err) + return nil, fmt.Errorf("failed to get root access to device: %w", err) } if err := inst.runOnHost(5*time.Minute, fmt.Sprintf("adb shell '"+ @@ -97,7 +97,7 @@ func (pool *Pool) Create(workdir string, index int) (vmimpl.Instance, error) { "chmod 0755 /sys/kernel/debug;"+ "mkdir %s;"+ "'", deviceRoot)); err != nil { - return nil, fmt.Errorf("failed to mount debugfs to /sys/kernel/debug: %s", err) + return nil, fmt.Errorf("failed to mount debugfs to /sys/kernel/debug: %w", err) } return inst, nil @@ -120,14 +120,14 @@ func (inst *instance) runOnHost(timeout time.Duration, command string) error { func (inst *instance) Copy(hostSrc string) (string, error) { gceDst, err := inst.gceInst.Copy(hostSrc) if err != nil { - return "", fmt.Errorf("error copying to worker instance: %s", err) + return "", fmt.Errorf("error copying to worker instance: %w", err) } deviceDst := filepath.Join(deviceRoot, filepath.Base(hostSrc)) pushCmd := fmt.Sprintf("adb push %s %s", gceDst, deviceDst) if err := inst.runOnHost(5*time.Minute, pushCmd); err != nil { - return "", fmt.Errorf("error pushing to device: %s", err) + return "", fmt.Errorf("error pushing to device: %w", err) } return deviceDst, nil @@ -136,7 +136,7 @@ func (inst *instance) Copy(hostSrc string) (string, error) { func (inst *instance) Forward(port int) (string, error) { hostForward, err := inst.gceInst.Forward(port) if err != nil { - return "", fmt.Errorf("failed to get IP/port from GCE instance: %s", err) + return "", fmt.Errorf("failed to get IP/port from GCE instance: %w", err) } // Run socat in the background. This hangs when run from runOnHost(). @@ -145,7 +145,7 @@ func (inst *instance) Forward(port int) (string, error) { cmd := exec.Command("ssh", cmdArgs...) cmd.Dir = "/root" if err := cmd.Run(); err != nil { - return "", fmt.Errorf("unable to forward port on host: %s", err) + return "", fmt.Errorf("unable to forward port on host: %w", err) } for i := 0; i < 100; i++ { @@ -157,7 +157,7 @@ func (inst *instance) Forward(port int) (string, error) { } } - return "", fmt.Errorf("unable to forward port on device: %s", err) + return "", fmt.Errorf("unable to forward port on device: %w", err) } func (inst *instance) Close() { diff --git a/vm/gce/gce.go b/vm/gce/gce.go index 208cce612..60a88010c 100644 --- a/vm/gce/gce.go +++ b/vm/gce/gce.go @@ -83,7 +83,7 @@ func Ctor(env *vmimpl.Env, consoleReadCmd string) (*Pool, error) { DisplayDevice: true, } if err := config.LoadData(env.Config, cfg); err != nil { - return nil, fmt.Errorf("failed to parse gce vm config: %v", err) + return nil, fmt.Errorf("failed to parse gce vm config: %w", err) } if cfg.Count < 1 || cfg.Count > 1000 { return nil, fmt.Errorf("invalid config param count: %v, want [1, 1000]", cfg.Count) @@ -107,7 +107,7 @@ func Ctor(env *vmimpl.Env, consoleReadCmd string) (*Pool, error) { GCE, err := gce.NewContext(cfg.ZoneID) if err != nil { - return nil, fmt.Errorf("failed to init gce: %v", err) + return nil, fmt.Errorf("failed to init gce: %w", err) } log.Logf(0, "GCE initialized: running on %v, internal IP %v, project %v, zone %v, net %v/%v", GCE.Instance, GCE.InternalIP, GCE.ProjectID, GCE.ZoneID, GCE.Network, GCE.Subnetwork) @@ -121,10 +121,10 @@ func Ctor(env *vmimpl.Env, consoleReadCmd string) (*Pool, error) { } log.Logf(0, "creating GCE image %v...", cfg.GCEImage) if err := GCE.DeleteImage(cfg.GCEImage); err != nil { - return nil, fmt.Errorf("failed to delete GCE image: %v", err) + return nil, fmt.Errorf("failed to delete GCE image: %w", err) } if err := GCE.CreateImage(cfg.GCEImage, gcsImage); err != nil { - return nil, fmt.Errorf("failed to create GCE image: %v", err) + return nil, fmt.Errorf("failed to create GCE image: %w", err) } } pool := &Pool{ @@ -146,11 +146,11 @@ func (pool *Pool) Create(workdir string, index int) (vmimpl.Instance, error) { gceKey := filepath.Join(workdir, "key") keygen := osutil.Command("ssh-keygen", "-t", "ed25519", "-N", "", "-C", "syzkaller", "-f", gceKey) if out, err := keygen.CombinedOutput(); err != nil { - return nil, fmt.Errorf("failed to execute ssh-keygen: %v\n%s", err, out) + return nil, fmt.Errorf("failed to execute ssh-keygen: %w\n%s", err, out) } gceKeyPub, err := os.ReadFile(gceKey + ".pub") if err != nil { - return nil, fmt.Errorf("failed to read file: %v", err) + return nil, fmt.Errorf("failed to read file: %w", err) } log.Logf(0, "deleting instance: %v", name) @@ -258,7 +258,7 @@ func (inst *instance) Run(timeout time.Duration, stop <-chan bool, command strin if err := con.Start(); err != nil { conRpipe.Close() conWpipe.Close() - return nil, nil, fmt.Errorf("failed to connect to console server: %v", err) + return nil, nil, fmt.Errorf("failed to connect to console server: %w", err) } conWpipe.Close() @@ -292,7 +292,7 @@ func (inst *instance) Run(timeout time.Duration, stop <-chan bool, command strin merger.Wait() sshRpipe.Close() sshWpipe.Close() - return nil, nil, fmt.Errorf("failed to connect to instance: %v", err) + return nil, nil, fmt.Errorf("failed to connect to instance: %w", err) } sshWpipe.Close() merger.Add("ssh", sshRpipe) @@ -428,7 +428,7 @@ func (pool *Pool) getSerialPortOutput(name, gceKey string) ([]byte, error) { return nil, err } if err := con.Start(); err != nil { - return nil, fmt.Errorf("failed to connect to console server: %v", err) + return nil, fmt.Errorf("failed to connect to console server: %w", err) } conWpipe.Close() done := make(chan bool) @@ -458,23 +458,23 @@ func (pool *Pool) getSerialPortOutput(name, gceKey string) ([]byte, error) { func uploadImageToGCS(localImage, gcsImage string) error { GCS, err := gcs.NewClient() if err != nil { - return fmt.Errorf("failed to create GCS client: %v", err) + return fmt.Errorf("failed to create GCS client: %w", err) } defer GCS.Close() localReader, err := os.Open(localImage) if err != nil { - return fmt.Errorf("failed to open image file: %v", err) + return fmt.Errorf("failed to open image file: %w", err) } defer localReader.Close() localStat, err := localReader.Stat() if err != nil { - return fmt.Errorf("failed to stat image file: %v", err) + return fmt.Errorf("failed to stat image file: %w", err) } gcsWriter, err := GCS.FileWriter(gcsImage) if err != nil { - return fmt.Errorf("failed to upload image: %v", err) + return fmt.Errorf("failed to upload image: %w", err) } defer gcsWriter.Close() @@ -491,19 +491,19 @@ func uploadImageToGCS(localImage, gcsImage string) error { } setGNUFormat(tarHeader) if err := tarWriter.WriteHeader(tarHeader); err != nil { - return fmt.Errorf("failed to write image tar header: %v", err) + return fmt.Errorf("failed to write image tar header: %w", err) } if _, err := io.Copy(tarWriter, localReader); err != nil { - return fmt.Errorf("failed to write image file: %v", err) + return fmt.Errorf("failed to write image file: %w", err) } if err := tarWriter.Close(); err != nil { - return fmt.Errorf("failed to write image file: %v", err) + return fmt.Errorf("failed to write image file: %w", err) } if err := gzipWriter.Close(); err != nil { - return fmt.Errorf("failed to write image file: %v", err) + return fmt.Errorf("failed to write image file: %w", err) } if err := gcsWriter.Close(); err != nil { - return fmt.Errorf("failed to write image file: %v", err) + return fmt.Errorf("failed to write image file: %w", err) } return nil } diff --git a/vm/gvisor/gvisor.go b/vm/gvisor/gvisor.go index 2e9da0eec..69b852b0d 100644 --- a/vm/gvisor/gvisor.go +++ b/vm/gvisor/gvisor.go @@ -55,7 +55,7 @@ func ctor(env *vmimpl.Env) (vmimpl.Pool, error) { Count: 1, } if err := config.LoadData(env.Config, cfg); err != nil { - return nil, fmt.Errorf("failed to parse vm config: %v", err) + return nil, fmt.Errorf("failed to parse vm config: %w", err) } if cfg.Count < 1 || cfg.Count > 128 { return nil, fmt.Errorf("invalid config param count: %v, want [1, 128]", cfg.Count) @@ -100,7 +100,7 @@ func (pool *Pool) Create(workdir string, index int) (vmimpl.Instance, error) { } bin, err := exec.LookPath(os.Args[0]) if err != nil { - return nil, fmt.Errorf("failed to lookup %v: %v", os.Args[0], err) + return nil, fmt.Errorf("failed to lookup %v: %w", os.Args[0], err) } if err := osutil.CopyFile(bin, filepath.Join(imageDir, "init")); err != nil { return nil, err diff --git a/vm/isolated/isolated.go b/vm/isolated/isolated.go index 922dea482..76d5284c0 100755 --- a/vm/isolated/isolated.go +++ b/vm/isolated/isolated.go @@ -70,7 +70,7 @@ func ctor(env *vmimpl.Env) (vmimpl.Pool, error) { } for _, target := range cfg.Targets { if _, _, err := splitTargetPort(target); err != nil { - return nil, fmt.Errorf("bad target %q: %v", target, err) + return nil, fmt.Errorf("bad target %q: %w", target, err) } } if len(cfg.USBDevNums) > 0 { @@ -116,7 +116,7 @@ func (pool *Pool) Create(workdir string, index int) (vmimpl.Instance, error) { } }() if err := inst.repair(); err != nil { - return nil, fmt.Errorf("repair failed: %v", err) + return nil, fmt.Errorf("repair failed: %w", err) } // Remount to writable. @@ -190,7 +190,7 @@ func (inst *instance) ssh(command string) error { if inst.debug { log.Logf(0, "ssh failed: %v\n%s", err, out) } - return fmt.Errorf("ssh %+v failed: %v\n%s", args, err, out) + return fmt.Errorf("ssh %+v failed: %w\n%s", args, err, out) } close(done) if inst.debug { @@ -235,7 +235,7 @@ func (inst *instance) repair() error { log.Logf(2, "isolated: ssh succeeded, trying to reboot by ssh") inst.ssh("reboot") // reboot will return an error, ignore it if err := inst.waitRebootAndSSH(5*60, 30*time.Minute); err != nil { - return fmt.Errorf("waitRebootAndSSH failed: %v", err) + return fmt.Errorf("waitRebootAndSSH failed: %w", err) } } } @@ -244,11 +244,11 @@ func (inst *instance) repair() error { // Execute the contents of the StartupScript on the DUT. contents, err := os.ReadFile(inst.cfg.StartupScript) if err != nil { - return fmt.Errorf("unable to read startup_script: %v", err) + return fmt.Errorf("unable to read startup_script: %w", err) } c := string(contents) if err := inst.ssh(fmt.Sprintf("bash -c \"%v\"", vmimpl.EscapeDoubleQuotes(c))); err != nil { - return fmt.Errorf("failed to execute startup_script: %v", err) + return fmt.Errorf("failed to execute startup_script: %w", err) } log.Logf(2, "isolated: done executing startup_script") } @@ -370,7 +370,7 @@ func (inst *instance) readPstoreContents() ([]byte, error) { cmd.Stdout = &stdout cmd.Stderr = &stderr if err := cmd.Run(); err != nil { - return nil, fmt.Errorf("unable to read pstore file: %v: %v", err, stderr.String()) + return nil, fmt.Errorf("unable to read pstore file: %w: %v", err, stderr.String()) } return stdout.Bytes(), nil } diff --git a/vm/kvm/kvm.go b/vm/kvm/kvm.go index e63e128e9..353f4300e 100644 --- a/vm/kvm/kvm.go +++ b/vm/kvm/kvm.go @@ -64,7 +64,7 @@ func ctor(env *vmimpl.Env) (vmimpl.Pool, error) { Lkvm: "lkvm", } if err := config.LoadData(env.Config, cfg); err != nil { - return nil, fmt.Errorf("failed to parse kvm vm config: %v", err) + return nil, fmt.Errorf("failed to parse kvm vm config: %w", err) } if cfg.Count < 1 || cfg.Count > 128 { return nil, fmt.Errorf("invalid config param count: %v, want [1, 128]", cfg.Count) @@ -119,16 +119,16 @@ func (pool *Pool) Create(workdir string, index int) (vmimpl.Instance, error) { os.Remove(inst.sandboxPath + ".sock") out, err := osutil.Command(inst.cfg.Lkvm, "setup", sandbox).CombinedOutput() if err != nil { - return nil, fmt.Errorf("failed to lkvm setup: %v\n%s", err, out) + return nil, fmt.Errorf("failed to lkvm setup: %w\n%s", err, out) } scriptPath := filepath.Join(workdir, "script.sh") if err := osutil.WriteExecFile(scriptPath, []byte(script)); err != nil { - return nil, fmt.Errorf("failed to create temp file: %v", err) + return nil, fmt.Errorf("failed to create temp file: %w", err) } rpipe, wpipe, err := osutil.LongPipe() if err != nil { - return nil, fmt.Errorf("failed to create pipe: %v", err) + return nil, fmt.Errorf("failed to create pipe: %w", err) } inst.lkvm = osutil.Command("taskset", "-c", strconv.Itoa(index%runtime.NumCPU()), @@ -146,7 +146,7 @@ func (pool *Pool) Create(workdir string, index int) (vmimpl.Instance, error) { if err := inst.lkvm.Start(); err != nil { rpipe.Close() wpipe.Close() - return nil, fmt.Errorf("failed to start lkvm: %v", err) + return nil, fmt.Errorf("failed to start lkvm: %w", err) } // Start output reading goroutine. @@ -194,7 +194,7 @@ func (pool *Pool) Create(workdir string, index int) (vmimpl.Instance, error) { err = <-errc } if err != nil { - return nil, fmt.Errorf("failed to run script: %v", err) + return nil, fmt.Errorf("failed to run script: %w", err) } closeInst = nil diff --git a/vm/proxyapp/proxyappclient.go b/vm/proxyapp/proxyappclient.go index daf73df0e..31a19fdec 100644 --- a/vm/proxyapp/proxyappclient.go +++ b/vm/proxyapp/proxyappclient.go @@ -211,7 +211,7 @@ func initNetworkRPCClient(cfg *Config) (*rpc.Client, error) { var err error conn, err = net.Dial("tcp", cfg.RPCServerURI) if err != nil { - return nil, fmt.Errorf("dial: %v", err) + return nil, fmt.Errorf("dial: %w", err) } case "tls": var certPool *x509.CertPool @@ -220,17 +220,17 @@ func initNetworkRPCClient(cfg *Config) (*rpc.Client, error) { certPool = x509.NewCertPool() b, err := os.ReadFile(cfg.ServerTLSCert) if err != nil { - return nil, fmt.Errorf("read server certificate: %v", err) + return nil, fmt.Errorf("read server certificate: %w", err) } if !certPool.AppendCertsFromPEM(b) { - return nil, fmt.Errorf("append server certificate to empty pool: %v", err) + return nil, fmt.Errorf("append server certificate to empty pool: %w", err) } } var err error conn, err = tls.Dial("tcp", cfg.RPCServerURI, &tls.Config{RootCAs: certPool}) if err != nil { - return nil, fmt.Errorf("dial with tls: %v", err) + return nil, fmt.Errorf("dial with tls: %w", err) } case "mtls": return nil, fmt.Errorf("mutual TLS not implemented") @@ -353,7 +353,7 @@ func (proxy *ProxyApp) CreatePool(config *Config, image string, debug bool) (int if config.TransferFileContent { imageData, err := os.ReadFile(image) if err != nil { - return 0, fmt.Errorf("read image on host: %v", err) + return 0, fmt.Errorf("read image on host: %w", err) } params.ImageData = imageData @@ -391,7 +391,7 @@ func (proxy *ProxyApp) CreateInstance(workdir, image string, index int) (vmimpl. data, err := os.ReadFile(path) if err != nil { - return fmt.Errorf("read file on host: %s", err) + return fmt.Errorf("read file on host: %w", err) } workdirData[name] = data @@ -400,7 +400,7 @@ func (proxy *ProxyApp) CreateInstance(workdir, image string, index int) (vmimpl. }) if err != nil { - return nil, fmt.Errorf("failed to walk workdir: %v", err) + return nil, fmt.Errorf("failed to walk workdir: %w", err) } params.WorkdirData = workdirData @@ -434,7 +434,7 @@ func (inst *instance) Copy(hostSrc string) (string, error) { if inst.ProxyApp.transferFileContent { data, err := os.ReadFile(hostSrc) if err != nil { - return "", fmt.Errorf("read file on host: %s", err) + return "", fmt.Errorf("read file on host: %w", err) } params.Data = data diff --git a/vm/qemu/qemu.go b/vm/qemu/qemu.go index d32d58143..bb616af47 100644 --- a/vm/qemu/qemu.go +++ b/vm/qemu/qemu.go @@ -275,7 +275,7 @@ func ctor(env *vmimpl.Env) (vmimpl.Pool, error) { Snapshot: true, } if err := config.LoadData(env.Config, cfg); err != nil { - return nil, fmt.Errorf("failed to parse qemu vm config: %v", err) + return nil, fmt.Errorf("failed to parse qemu vm config: %w", err) } if cfg.Count < 1 || cfg.Count > 128 { return nil, fmt.Errorf("invalid config param count: %v, want [1, 128]", cfg.Count) @@ -340,7 +340,7 @@ func (pool *Pool) Create(workdir string, index int) (vmimpl.Instance, error) { } initFile := filepath.Join(workdir, "init.sh") if err := osutil.WriteExecFile(initFile, []byte(strings.Replace(initScript, "{{KEY}}", sshkey, -1))); err != nil { - return nil, fmt.Errorf("failed to create init file: %v", err) + return nil, fmt.Errorf("failed to create init file: %w", err) } } @@ -513,7 +513,7 @@ func (inst *instance) boot() error { qemu.Stdout = inst.wpipe qemu.Stderr = inst.wpipe if err := qemu.Start(); err != nil { - return fmt.Errorf("failed to start %v %+v: %v", inst.cfg.Qemu, args, err) + return fmt.Errorf("failed to start %v %+v: %w", inst.cfg.Qemu, args, err) } inst.wpipe.Close() inst.wpipe = nil diff --git a/vm/starnix/starnix.go b/vm/starnix/starnix.go index f868284b2..78bad4a44 100644 --- a/vm/starnix/starnix.go +++ b/vm/starnix/starnix.go @@ -59,7 +59,7 @@ const targetDir = "/data" func ctor(env *vmimpl.Env) (vmimpl.Pool, error) { cfg := &Config{} if err := config.LoadData(env.Config, cfg); err != nil { - return nil, fmt.Errorf("failed to parse starnix vm config: %v", err) + return nil, fmt.Errorf("failed to parse starnix vm config: %w", err) } if cfg.Count < 1 || cfg.Count > 128 { return nil, fmt.Errorf("invalid config param count: %v, want [1, 128]", cfg.Count) @@ -106,7 +106,7 @@ func (pool *Pool) Create(workdir string, index int) (vmimpl.Instance, error) { if err := inst.setFuchsiaVersion(); err != nil { return nil, fmt.Errorf( - "there is an error running ffx commands in the Fuchsia checkout (%q): %v", + "there is an error running ffx commands in the Fuchsia checkout (%q): %w", inst.fuchsiaDirectory, err) } @@ -129,20 +129,20 @@ func (inst *instance) boot() error { inst.ffx("emu", "stop", inst.name) if err := inst.startFuchsiaVM(); err != nil { - return fmt.Errorf("could not start Fuchsia VM: %v", err) + return fmt.Errorf("could not start Fuchsia VM: %w", err) } if err := inst.startAdbServerAndConnection(1 * time.Minute); err != nil { - return fmt.Errorf("could not start and connect to the adb server: %v", err) + return fmt.Errorf("could not start and connect to the adb server: %w", err) } if err := inst.createAdbScript(); err != nil { - return fmt.Errorf("could not create adb script: %v", err) + return fmt.Errorf("could not create adb script: %w", err) } err := inst.startFuchsiaLogs() if err != nil { - return fmt.Errorf("could not start fuchsia logs: %v", err) + return fmt.Errorf("could not start fuchsia logs: %w", err) } if inst.debug { log.Logf(0, "%s booted successfully", inst.name) diff --git a/vm/vm.go b/vm/vm.go index e1f9cda60..fc2e0eb2c 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -132,7 +132,7 @@ func (pool *Pool) Create(index int) (*Instance, error) { } workdir, err := osutil.ProcessTempDir(pool.workdir) if err != nil { - return nil, fmt.Errorf("failed to create instance temp dir: %v", err) + return nil, fmt.Errorf("failed to create instance temp dir: %w", err) } if pool.template != "" { if err := osutil.CopyDirRecursively(pool.template, filepath.Join(workdir, "template")); err != nil { diff --git a/vm/vmimpl/console.go b/vm/vmimpl/console.go index 5958b2a19..6744ac10c 100644 --- a/vm/vmimpl/console.go +++ b/vm/vmimpl/console.go @@ -18,7 +18,7 @@ import ( func OpenConsole(con string) (rc io.ReadCloser, err error) { fd, err := syscall.Open(con, syscall.O_RDONLY|syscall.O_NOCTTY|syscall.O_SYNC, 0) if err != nil { - return nil, fmt.Errorf("failed to open console file: %v", err) + return nil, fmt.Errorf("failed to open console file: %w", err) } defer func() { if fd != -1 { @@ -27,7 +27,7 @@ func OpenConsole(con string) (rc io.ReadCloser, err error) { }() term, err := unix.IoctlGetTermios(fd, syscallTCGETS) if err != nil { - return nil, fmt.Errorf("failed to get console termios: %v", err) + return nil, fmt.Errorf("failed to get console termios: %w", err) } // No parity bit, only need 1 stop bit, no hardware flowcontrol, term.Cflag &^= unixCBAUD | unix.CSIZE | unix.PARENB | unix.CSTOPB | unixCRTSCTS @@ -41,7 +41,7 @@ func OpenConsole(con string) (rc io.ReadCloser, err error) { term.Cc[unix.VMIN] = 0 term.Cc[unix.VTIME] = 10 // 1 second timeout if err = unix.IoctlSetTermios(fd, syscallTCSETS, term); err != nil { - return nil, fmt.Errorf("failed to get console termios: %v", err) + return nil, fmt.Errorf("failed to get console termios: %w", err) } tmp := fd fd = -1 @@ -95,7 +95,7 @@ func OpenRemoteKernelLog(ip, console string) (rc io.ReadCloser, err error) { if err := cmd.Start(); err != nil { rpipe.Close() wpipe.Close() - return nil, fmt.Errorf("failed to connect to console server: %v", err) + return nil, fmt.Errorf("failed to connect to console server: %w", err) } wpipe.Close() con := &remoteCon{ @@ -118,7 +118,7 @@ func OpenRemoteConsole(bin string, args ...string) (rc io.ReadCloser, err error) if err := cmd.Start(); err != nil { rpipe.Close() wpipe.Close() - return nil, fmt.Errorf("failed to start adb: %v", err) + return nil, fmt.Errorf("failed to start adb: %w", err) } wpipe.Close() con := &remoteCon{ diff --git a/vm/vmm/vmm.go b/vm/vmm/vmm.go index 1f9b911f7..bcddc3af0 100644 --- a/vm/vmm/vmm.go +++ b/vm/vmm/vmm.go @@ -66,7 +66,7 @@ func ctor(env *vmimpl.Env) (vmimpl.Pool, error) { } if err := config.LoadData(env.Config, cfg); err != nil { - return nil, fmt.Errorf("failed to parse vmm vm config: %v", err) + return nil, fmt.Errorf("failed to parse vmm vm config: %w", err) } if cfg.Count < 1 || cfg.Count > 128 { return nil, fmt.Errorf("invalid config param count: %v, want [1-128]", cfg.Count) -- cgit mrf-deployment