|
9 | 9 |
|
10 | 10 | # CPE Regex
|
11 | 11 | CPE_REGEX = re.compile(
|
12 |
| - "cpe:?:[^:]+:[^:]+:(?P<vendor>[^:]+):(?P<package>[^:]+):(?P<version>[^:]+)" |
| 12 | + "cpe:?:[^:]+:[^:]+:(?P<vendor>[^:]+):(?P<package>[^:]+):(?P<version>[^:]+)?" |
13 | 13 | )
|
14 | 14 |
|
15 | 15 |
|
@@ -142,17 +142,37 @@ def __init__(
|
142 | 142 | ):
|
143 | 143 | parts = CPE_REGEX.match(cpe_uri)
|
144 | 144 | self.cpe_uri = cpe_uri
|
145 |
| - self.package = package if package else parts.group("package") |
146 |
| - self.min_affected_version_including = ( |
147 |
| - min_affected_version_including |
148 |
| - if min_affected_version_including |
149 |
| - else parts.group("version") |
150 |
| - ) |
151 |
| - self.max_affected_version_including = ( |
152 |
| - max_affected_version_including |
153 |
| - if max_affected_version_including |
154 |
| - else parts.group("version") |
155 |
| - ) |
| 145 | + # Occasionally, NVD CPE value could be invalid. We need to guard against this |
| 146 | + if parts: |
| 147 | + self.package = package if package else parts.group("package") |
| 148 | + self.min_affected_version_including = ( |
| 149 | + min_affected_version_including |
| 150 | + if min_affected_version_including |
| 151 | + else parts.group("version") |
| 152 | + ) |
| 153 | + self.max_affected_version_including = ( |
| 154 | + max_affected_version_including |
| 155 | + if max_affected_version_including |
| 156 | + else parts.group("version") |
| 157 | + ) |
| 158 | + else: |
| 159 | + # Use split to extract the package name in case of bad CPE value |
| 160 | + package_workaround = "" |
| 161 | + if cpe_uri: |
| 162 | + cpe_parts = cpe_uri.split(":") |
| 163 | + if len(cpe_parts) > 4: |
| 164 | + package_workaround = cpe_parts[4] |
| 165 | + self.package = package if package else package_workaround |
| 166 | + self.min_affected_version_including = ( |
| 167 | + min_affected_version_including |
| 168 | + if min_affected_version_including |
| 169 | + else "*" |
| 170 | + ) |
| 171 | + self.max_affected_version_including = ( |
| 172 | + max_affected_version_including |
| 173 | + if max_affected_version_including |
| 174 | + else "*" |
| 175 | + ) |
156 | 176 | self.min_affected_version_excluding = (
|
157 | 177 | min_affected_version_excluding if min_affected_version_excluding else None
|
158 | 178 | )
|
|
0 commit comments