in cvefeed/dictionary.go [50:95]
func LoadFeed(loadFunc func(string) ([]Vuln, error), paths ...string) (Dictionary, error) {
dict := make(Dictionary)
var wg sync.WaitGroup
done := make(chan struct{})
errDone := make(chan struct{})
dictChan := make(chan []Vuln, 1)
errChan := make(chan error, 1)
for _, path := range paths {
wg.Add(1)
go func(path string) {
defer wg.Done()
feed, err := loadFunc(path)
if err != nil {
errChan <- fmt.Errorf("dictionary: failed to load feed %q: %v", path, err)
return
}
dictChan <- feed
}(path)
}
go func() {
for d := range dictChan {
for _, cve := range d {
if cveid := cve.ID(); cveid != "" {
dict[cveid] = cve
}
}
}
close(done)
}()
var errs []string
go func() {
for e := range errChan {
errs = append(errs, e.Error())
}
close(errDone)
}()
wg.Wait()
close(dictChan)
close(errChan)
<-done
<-errDone
if len(errs) > 0 {
return dict, errors.New(strings.Join(errs, "\n"))
}
return dict, nil
}