|
23 | 23 | import asyncio |
24 | 24 | import os |
25 | 25 | import dataclasses |
26 | | -import json |
| 26 | +import traceback |
| 27 | +import logging |
| 28 | + |
27 | 29 | from typing import Set |
28 | 30 | from typing import Tuple |
29 | 31 | from typing import List |
|
33 | 35 | import requests |
34 | 36 | from packageurl import PackageURL |
35 | 37 | from univers.version_specifier import VersionSpecifier |
36 | | -from univers.versions import version_class_by_package_type |
| 38 | +from univers.versions import version_class_by_package_type, InvalidVersion |
37 | 39 |
|
38 | 40 | from vulnerabilities.data_source import Advisory |
39 | 41 | from vulnerabilities.data_source import DataSource |
|
48 | 50 | from vulnerabilities.severity_systems import scoring_systems |
49 | 51 | from vulnerabilities.helpers import nearest_patched_package |
50 | 52 |
|
| 53 | +logger = logging.getLogger(__name__) |
| 54 | + |
51 | 55 | # set of all possible values of first '%s' = {'MAVEN','COMPOSER', 'NUGET', 'RUBYGEMS', 'PYPI'} |
52 | 56 | # second '%s' is interesting, it will have the value '' for the first request, |
53 | 57 | # since we don't have any value for endCursor at the beginning |
@@ -265,9 +269,14 @@ def categorize_versions( |
265 | 269 | affected_versions = [] |
266 | 270 | unaffected_versions = [] |
267 | 271 | for version in all_versions: |
268 | | - if version_class(version) in version_range: |
269 | | - affected_versions.append(version) |
270 | | - else: |
271 | | - unaffected_versions.append(version) |
| 272 | + try: |
| 273 | + if version_class(version) in version_range: |
| 274 | + affected_versions.append(version) |
| 275 | + else: |
| 276 | + unaffected_versions.append(version) |
| 277 | + except InvalidVersion: |
| 278 | + logger.error ( |
| 279 | + f"Failed to parse version: {version!r}:\n" + traceback.format_exc() |
| 280 | + ) |
272 | 281 |
|
273 | 282 | return (affected_versions, unaffected_versions) |
0 commit comments