Skip to content

Commit 0fbad41

Browse files
committed
cmd/vulnreport: improve cgo error message
Give a distinct and helpful error message when cgo is the likely culprit. Change-Id: I419eb670a9251ae91de815c7c7a9ba9b7d872e8c Reviewed-on: https://go-review.googlesource.com/c/vulndb/+/461515 TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Tim King <taking@google.com> Reviewed-by: Tatiana Bradley <tatiana@golang.org>
1 parent f2a1768 commit 0fbad41

File tree

1 file changed

+35
-4
lines changed

1 file changed

+35
-4
lines changed

cmd/vulnreport/main.go

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -937,16 +937,47 @@ func loadPackage(cfg *packages.Config, importPath string) (_ []*packages.Package
937937
if err != nil {
938938
return nil, err
939939
}
940+
941+
if err := packageLoadingError(pkgs); err != nil {
942+
return nil, err
943+
}
944+
945+
return pkgs, nil
946+
}
947+
948+
// packageLoadingError returns an error summarizing packages.Package.Errors if there were any.
949+
func packageLoadingError(pkgs []*packages.Package) error {
950+
pkgError := func(pkg *packages.Package) error {
951+
var msgs []string
952+
for _, err := range pkg.Errors {
953+
msgs = append(msgs, err.Error())
954+
}
955+
if len(msgs) == 0 {
956+
return nil
957+
}
958+
// Report a more helpful error message for the package if possible.
959+
for _, msg := range msgs {
960+
// cgo failure?
961+
if strings.Contains(msg, "could not import C (no metadata for C)") {
962+
const url = `https://github.com/golang/vulndb/blob/master/doc/triage.md#vulnreport-cgo-failures`
963+
return fmt.Errorf("package %s has a cgo error (install relevant C packages? %s)\nerrors:%s", pkg.PkgPath, url, strings.Join(msgs, "\n"))
964+
}
965+
}
966+
return fmt.Errorf("package %s had %d errors: %s", pkg.PkgPath, len(msgs), strings.Join(msgs, "\n"))
967+
}
968+
969+
var paths []string
940970
var msgs []string
941971
packages.Visit(pkgs, nil, func(pkg *packages.Package) {
942-
for _, err := range pkg.Errors {
972+
if err := pkgError(pkg); err != nil {
973+
paths = append(paths, pkg.PkgPath)
943974
msgs = append(msgs, err.Error())
944975
}
945976
})
946-
if len(msgs) > 0 {
947-
return nil, fmt.Errorf("packages.Visit:\n%s", strings.Join(msgs, "\n"))
977+
if len(msgs) == 0 {
978+
return nil // no errors
948979
}
949-
return pkgs, nil
980+
return fmt.Errorf("packages with errors: %s\nerrors:\n%s", strings.Join(paths, " "), strings.Join(msgs, "\n"))
950981
}
951982

952983
func changeToTempDir() (cleanup func(), _ error) {

0 commit comments

Comments
 (0)