diff --git a/commands/util.go b/commands/util.go index bd4b5249..81588edd 100644 --- a/commands/util.go +++ b/commands/util.go @@ -202,10 +202,12 @@ func scanVulnByCpeNames(cpeNames []string, scannedVulns []models.VulnInfo) ([]mo val.CpeNames = names set[detail.CveID] = val } else { - set[detail.CveID] = models.VulnInfo{ + v := models.VulnInfo{ CveID: detail.CveID, CpeNames: []string{name}, } + v.NilSliceToEmpty() + set[detail.CveID] = v } } } diff --git a/glide.lock b/glide.lock index 46782ff0..13cfcbed 100644 --- a/glide.lock +++ b/glide.lock @@ -70,7 +70,7 @@ imports: - name: github.com/k0kubun/pp version: f5dce6ed0ccf6c350f1679964ff6b61f3d6d2033 - name: github.com/kotakanbe/go-cve-dictionary - version: c6894c632b69f1879fa49aa2f7b6a6c553061cfb + version: bbfdd41e7785a9b7163b5109b10ac2dea8f36d84 subpackages: - config - db diff --git a/models/models.go b/models/models.go index 0b19e07a..88661ee0 100644 --- a/models/models.go +++ b/models/models.go @@ -92,18 +92,17 @@ func (r ScanResult) FillCveDetail() (ScanResult, error) { return r, err } - icves := config.Conf.Servers[r.ServerName].IgnoreCves - - var known, unknown, ignored CveInfos + known, unknown, ignored := CveInfos{}, CveInfos{}, CveInfos{} for _, d := range ds { cinfo := CveInfo{ CveDetail: d, VulnInfo: set[d.CveID], } + cinfo.NilSliceToEmpty() // ignored found := false - for _, icve := range icves { + for _, icve := range config.Conf.Servers[r.ServerName].IgnoreCves { if icve == d.CveID { ignored = append(ignored, cinfo) found = true @@ -251,6 +250,16 @@ type VulnInfo struct { CpeNames []string } +// NilSliceToEmpty set nil slice fields to empty slice to avoid null in JSON +func (v *VulnInfo) NilSliceToEmpty() { + if v.CpeNames == nil { + v.CpeNames = []string{} + } + if v.DistroAdvisories == nil { + v.DistroAdvisories = []DistroAdvisory{} + } +} + // FindByCveID find by CVEID func (s VulnInfos) FindByCveID(cveID string) (VulnInfo, bool) { for _, p := range s { @@ -312,6 +321,22 @@ type CveInfo struct { VulnInfo } +// NilSliceToEmpty set nil slice fields to empty slice to avoid null in JSON +func (c *CveInfo) NilSliceToEmpty() { + if c.CveDetail.Nvd.Cpes == nil { + c.CveDetail.Nvd.Cpes = []cve.Cpe{} + } + if c.CveDetail.Jvn.Cpes == nil { + c.CveDetail.Jvn.Cpes = []cve.Cpe{} + } + if c.CveDetail.Nvd.References == nil { + c.CveDetail.Nvd.References = []cve.Reference{} + } + if c.CveDetail.Jvn.References == nil { + c.CveDetail.Jvn.References = []cve.Reference{} + } +} + // PackageInfoList is slice of PackageInfo type PackageInfoList []PackageInfo diff --git a/scan/base.go b/scan/base.go index 813b8b06..0fd3fe15 100644 --- a/scan/base.go +++ b/scan/base.go @@ -287,6 +287,11 @@ func (l *base) convertToModel() models.ScanResult { errs = append(errs, fmt.Sprintf("%s", e)) } + // Avoid null slice being null in JSON + for i := range l.VulnInfos { + l.VulnInfos[i].NilSliceToEmpty() + } + return models.ScanResult{ ServerName: l.ServerInfo.ServerName, ScannedAt: time.Now(),