@@ -27,6 +27,7 @@ import (
27
27
"slices"
28
28
"sort"
29
29
"strings"
30
+ "sync"
30
31
"time"
31
32
32
33
"gopkg.in/yaml.v2"
@@ -785,27 +786,46 @@ func LoadAllCVEs(cvePath string) map[cves.CVEID]cves.Vulnerability {
785
786
logger .Fatal ("Failed to read dir" , slog .String ("path" , cvePath ), slog .Any ("err" , err ))
786
787
}
787
788
788
- result := make (map [cves.CVEID ]cves.Vulnerability )
789
+ vulnsChan := make (chan cves.Vulnerability )
790
+ var wg sync.WaitGroup
789
791
790
792
for _ , entry := range dir {
791
793
if ! strings .HasSuffix (entry .Name (), ".json" ) {
792
794
continue
793
795
}
794
- file , err := os .Open (path .Join (cvePath , entry .Name ()))
795
- if err != nil {
796
- logger .Fatal ("Failed to open CVE JSON" , slog .String ("path" , path .Join (cvePath , entry .Name ())), slog .Any ("err" , err ))
797
- }
798
- var nvdcve cves.CVEAPIJSON20Schema
799
- err = json .NewDecoder (file ).Decode (& nvdcve )
800
- if err != nil {
801
- logger .Fatal ("Failed to decode JSON" , slog .String ("file" , file .Name ()), slog .Any ("err" , err ))
802
- }
803
796
804
- for _ , item := range nvdcve .Vulnerabilities {
805
- result [item .CVE .ID ] = item
806
- }
807
- logger .Info ("Loaded " + entry .Name (), slog .String ("cve" , entry .Name ()))
808
- file .Close ()
797
+ wg .Add (1 )
798
+ go func (filename string ) {
799
+ defer wg .Done ()
800
+ filePath := path .Join (cvePath , filename )
801
+ file , err := os .Open (filePath )
802
+ if err != nil {
803
+ logger .Error ("Failed to open CVE JSON" , slog .String ("path" , filePath ), slog .Any ("err" , err ))
804
+ return
805
+ }
806
+ defer file .Close ()
807
+
808
+ var nvdcve cves.CVEAPIJSON20Schema
809
+ if err := json .NewDecoder (file ).Decode (& nvdcve ); err != nil {
810
+ logger .Error ("Failed to decode JSON" , slog .String ("file" , filename ), slog .Any ("err" , err ))
811
+ return
812
+ }
813
+
814
+ for _ , item := range nvdcve .Vulnerabilities {
815
+ vulnsChan <- item
816
+ }
817
+ logger .Info ("Loaded " + filename , slog .String ("cve" , filename ))
818
+ }(entry .Name ())
819
+ }
820
+
821
+ go func () {
822
+ wg .Wait ()
823
+ close (vulnsChan )
824
+ }()
825
+
826
+ result := make (map [cves.CVEID ]cves.Vulnerability )
827
+ for item := range vulnsChan {
828
+ result [item .CVE .ID ] = item
809
829
}
810
830
811
831
return result
0 commit comments