@@ -21,7 +21,7 @@ import (
21
21
)
22
22
23
23
// Run is the main function for the govulncheck command line tool.
24
- func Run (ctx context.Context , cfg Config ) error {
24
+ func Run (ctx context.Context , cfg Config ) ( * Result , error ) {
25
25
dbs := []string {vulndbHost }
26
26
if db := os .Getenv (envGOVULNDB ); db != "" {
27
27
dbs = strings .Split (db , "," )
@@ -30,7 +30,7 @@ func Run(ctx context.Context, cfg Config) error {
30
30
HTTPCache : DefaultCache (),
31
31
})
32
32
if err != nil {
33
- return err
33
+ return nil , err
34
34
}
35
35
vcfg := & vulncheck.Config {Client : dbClient , SourceGoVersion : internal .GoVersion ()}
36
36
@@ -47,61 +47,67 @@ func Run(ctx context.Context, cfg Config) error {
47
47
case AnalysisTypeBinary :
48
48
f , err := os .Open (cfg .Patterns [0 ])
49
49
if err != nil {
50
- return err
50
+ return nil , err
51
51
}
52
52
defer f .Close ()
53
53
r , err = binary (ctx , f , vcfg )
54
54
if err != nil {
55
- return err
55
+ return nil , err
56
56
}
57
57
case AnalysisTypeSource :
58
58
pkgs , err = loadPackages (cfg )
59
59
if err != nil {
60
60
// Try to provide a meaningful and actionable error message.
61
61
if ! fileExists (filepath .Join (cfg .SourceLoadConfig .Dir , "go.mod" )) {
62
- return ErrNoGoMod
62
+ return nil , ErrNoGoMod
63
63
}
64
64
if ! fileExists (filepath .Join (cfg .SourceLoadConfig .Dir , "go.sum" )) {
65
- return ErrNoGoSum
65
+ return nil , ErrNoGoSum
66
66
}
67
67
if isGoVersionMismatchError (err ) {
68
- return fmt .Errorf ("%v\n \n %v" , ErrGoVersionMismatch , err )
68
+ return nil , fmt .Errorf ("%v\n \n %v" , ErrGoVersionMismatch , err )
69
69
}
70
- return err
70
+ return nil , err
71
71
}
72
72
73
73
// Sort pkgs so that the PkgNodes returned by vulncheck.Source will be
74
74
// deterministic.
75
75
sortPackages (pkgs )
76
76
r , err = vulncheck .Source (ctx , pkgs , vcfg )
77
77
if err != nil {
78
- return err
78
+ return nil , err
79
79
}
80
80
unaffected = filterUnaffected (r )
81
81
r .Vulns = filterCalled (r )
82
82
default :
83
- return fmt .Errorf ("%w: %s" , ErrInvalidAnalysisType , cfg .AnalysisType )
83
+ return nil , fmt .Errorf ("%w: %s" , ErrInvalidAnalysisType , cfg .AnalysisType )
84
84
}
85
85
86
86
switch cfg .OutputType {
87
87
case OutputTypeJSON :
88
88
// Following golang.org/x/tools/go/analysis/singlechecker,
89
89
// return 0 exit code in -json mode.
90
- return writeJSON (r )
90
+ if err := writeJSON (r ); err != nil {
91
+ return nil , err
92
+ }
93
+ return & Result {}, nil
91
94
case OutputTypeText , OutputTypeVerbose :
92
95
// set of top-level packages, used to find representative symbols
93
96
ci := getCallInfo (r , pkgs )
94
97
writeText (r , ci , unaffected , cfg .OutputType == OutputTypeVerbose )
95
98
case OutputTypeSummary :
96
99
ci := getCallInfo (r , pkgs )
97
- return writeJSON (summary (ci , unaffected ))
100
+ if err := writeJSON (summary (ci , unaffected )); err != nil {
101
+ return nil , err
102
+ }
103
+ return & Result {}, nil
98
104
default :
99
- return fmt .Errorf ("%w: %s" , ErrInvalidOutputType , cfg .OutputType )
105
+ return nil , fmt .Errorf ("%w: %s" , ErrInvalidOutputType , cfg .OutputType )
100
106
}
101
107
if len (r .Vulns ) > 0 {
102
- return ErrContainsVulnerabilties
108
+ return nil , ErrContainsVulnerabilties
103
109
}
104
- return nil
110
+ return & Result {}, nil
105
111
}
106
112
107
113
func writeJSON (r any ) error {
0 commit comments