66 "strconv"
77 "strings"
88
9- "github.com/google/osv/vulnfeeds/conversion"
9+ c "github.com/google/osv/vulnfeeds/conversion"
1010 "github.com/google/osv/vulnfeeds/models"
11+ "github.com/google/osv/vulnfeeds/utility/logger"
1112 "github.com/google/osv/vulnfeeds/vulns"
1213 "github.com/ossf/osv-schema/bindings/go/osvconstants"
1314 "github.com/ossf/osv-schema/bindings/go/osvschema"
@@ -30,7 +31,11 @@ func (l *LinuxVersionExtractor) handleAffected(v *vulns.Vulnerability, affected
3031 if cveAff .DefaultStatus == "affected" {
3132 versionRanges , versionType = findInverseAffectedRanges (cveAff , metrics )
3233 } else {
33- versionRanges , versionType = l .FindNormalAffectedRanges (cveAff , metrics )
34+ var versionRangesWithMetadata []models.RangeWithMetadata
35+ versionRangesWithMetadata , versionType = l .FindNormalAffectedRanges (cveAff , metrics )
36+ for _ , r := range versionRangesWithMetadata {
37+ versionRanges = append (versionRanges , r .Range )
38+ }
3439 }
3540 if (versionType == VersionRangeTypeGit && hasGit ) || len (versionRanges ) == 0 {
3641 continue
@@ -43,7 +48,7 @@ func (l *LinuxVersionExtractor) handleAffected(v *vulns.Vulnerability, affected
4348 }
4449 aff := createLinuxAffected (versionRanges , versionType , cveAff .Repo )
4550 metrics .AddSource (models .VersionSourceAffected )
46- conversion .AddAffected (v , aff , metrics )
51+ c .AddAffected (v , aff , metrics )
4752 }
4853
4954 return gotVersions
@@ -55,10 +60,16 @@ func (l *LinuxVersionExtractor) ExtractVersions(cve models.CVE5, v *vulns.Vulner
5560
5661 if ! gotVersions {
5762 metrics .AddNote ("No versions in affected, attempting to extract from CPE" )
58- versionRanges , _ := cpeVersionExtraction (cve , metrics )
59-
63+ versionRanges , err := cpeVersionExtraction (cve , metrics )
64+ if err != nil {
65+ logger .Warn ("Error when extracting CPE versions" )
66+ }
6067 if len (versionRanges ) != 0 {
61- aff := createLinuxAffected (versionRanges , VersionRangeTypeEcosystem , "" )
68+ var ranges []* osvschema.Range
69+ for _ , r := range versionRanges {
70+ ranges = append (ranges , r .Range )
71+ }
72+ aff := createLinuxAffected (ranges , VersionRangeTypeEcosystem , "" )
6273 v .Affected = append (v .Affected , aff )
6374 }
6475 }
@@ -136,7 +147,7 @@ func findInverseAffectedRanges(cveAff models.Affected, metrics *models.Conversio
136147 // Create ranges by pairing sorted introduced and fixed versions.
137148 for index , f := range fixed {
138149 if index < len (introduced ) {
139- ranges = append (ranges , conversion .BuildVersionRange (introduced [index ], "" , f ))
150+ ranges = append (ranges , c .BuildVersionRange (introduced [index ], "" , f ))
140151 metrics .AddNote ("Introduced from version value - %s" , introduced [index ])
141152 metrics .AddNote ("Fixed from version value - %s" , f )
142153 }
@@ -150,12 +161,12 @@ func findInverseAffectedRanges(cveAff models.Affected, metrics *models.Conversio
150161 return nil , VersionRangeTypeUnknown
151162}
152163
153- func (l * LinuxVersionExtractor ) FindNormalAffectedRanges (affected models.Affected , metrics * models.ConversionMetrics ) ([]* osvschema. Range , VersionRangeType ) {
164+ func (l * LinuxVersionExtractor ) FindNormalAffectedRanges (affected models.Affected , metrics * models.ConversionMetrics ) ([]models. RangeWithMetadata , VersionRangeType ) {
154165 versionTypesCount := make (map [VersionRangeType ]int )
155- var versionRanges []* osvschema. Range
166+ var versionRanges []models. RangeWithMetadata
156167 for _ , vers := range affected .Versions {
157168 ranges , currentVersionType , shouldContinue := initialNormalExtraction (vers , metrics , versionTypesCount )
158- versionRanges = append (versionRanges , ranges ... )
169+ versionRanges = append (versionRanges , c . ToRangeWithMetadata ( ranges , models . VersionSourceAffected ) ... )
159170 if shouldContinue {
160171 continue
161172 }
@@ -165,13 +176,16 @@ func (l *LinuxVersionExtractor) FindNormalAffectedRanges(affected models.Affecte
165176 metrics .AddNote ("Only version exists" )
166177
167178 if currentVersionType == VersionRangeTypeGit {
168- versionRanges = append (versionRanges , conversion .BuildVersionRange (vers .Version , "" , "" ))
179+ vr := []* osvschema.Range {c .BuildVersionRange (vers .Version , "" , "" )}
180+ versionRanges = append (versionRanges , c .ToRangeWithMetadata (vr , models .VersionSourceGit )... )
181+
169182 continue
170183 }
171184
172185 // As a fallback, assume a single version means it's the last affected version.
173186 if vulns .CheckQuality (vers .Version ).AtLeast (acceptableQuality ) {
174- versionRanges = append (versionRanges , conversion .BuildVersionRange ("0" , vers .Version , "" ))
187+ vr := []* osvschema.Range {c .BuildVersionRange ("0" , vers .Version , "" )}
188+ versionRanges = append (versionRanges , c .ToRangeWithMetadata (vr , models .VersionSourceAffected )... )
175189 metrics .AddNote ("Single version found %v - Assuming introduced = 0 and last affected = %v" , vers .Version , vers .Version )
176190 }
177191 }
0 commit comments