Skip to content

Commit e494a79

Browse files
authored
Merge branch 'main' into new-models
2 parents 455e3cb + 6f88845 commit e494a79

File tree

4 files changed

+54
-9
lines changed

4 files changed

+54
-9
lines changed

vulnerabilities/importer.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -223,18 +223,30 @@ def from_dict(cls, affected_pkg: dict):
223223
"""
224224
package = PackageURL(**affected_pkg["package"])
225225
affected_version_range = None
226-
if (
227-
affected_pkg["affected_version_range"]
228-
and affected_pkg["affected_version_range"] != "None"
229-
):
230-
affected_version_range = VersionRange.from_string(
231-
affected_pkg["affected_version_range"]
232-
)
226+
affected_range = affected_pkg["affected_version_range"]
227+
228+
# TODO: "None" is a likely bug
229+
if affected_range and affected_range != "None":
230+
try:
231+
affected_version_range = VersionRange.from_string(affected_range)
232+
except:
233+
tb = traceback.format_exc()
234+
logger.error(
235+
f"Cannot create AffectedPackage with invalid or unknown range: {affected_pkg!r} with error: {tb!r}"
236+
)
237+
return
238+
233239
fixed_version = affected_pkg["fixed_version"]
234240
if fixed_version and affected_version_range:
235241
# TODO: revisit after https://github.com/nexB/univers/issues/10
236242
fixed_version = affected_version_range.version_class(fixed_version)
237243

244+
if not fixed_version and not affected_version_range:
245+
logger.error(
246+
f"Cannot create AffectedPackage without fixed version or affected range: {affected_pkg!r}"
247+
)
248+
return
249+
238250
return cls(
239251
package=package,
240252
affected_version_range=affected_version_range,
@@ -295,7 +307,9 @@ def from_dict(cls, advisory_data):
295307
"aliases": advisory_data["aliases"],
296308
"summary": advisory_data["summary"],
297309
"affected_packages": [
298-
AffectedPackage.from_dict(pkg) for pkg in advisory_data["affected_packages"]
310+
AffectedPackage.from_dict(pkg)
311+
for pkg in advisory_data["affected_packages"]
312+
if pkg is not None
299313
],
300314
"references": [Reference.from_dict(ref) for ref in advisory_data["references"]],
301315
"date_published": datetime.datetime.fromisoformat(date_published)

vulnerabilities/improvers/default.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ def get_exact_purls(affected_package: AffectedPackage) -> Tuple[List[PackageURL]
105105
... )
106106
>>> assert expected == got
107107
"""
108+
if not affected_package:
109+
return [], []
108110

109111
try:
110112
vr = affected_package.affected_version_range

vulnerabilities/models.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1147,7 +1147,9 @@ def to_advisory_data(self) -> "AdvisoryData":
11471147
return AdvisoryData(
11481148
aliases=self.aliases,
11491149
summary=self.summary,
1150-
affected_packages=[AffectedPackage.from_dict(pkg) for pkg in self.affected_packages],
1150+
affected_packages=[
1151+
AffectedPackage.from_dict(pkg) for pkg in self.affected_packages if pkg
1152+
],
11511153
references=[Reference.from_dict(ref) for ref in self.references],
11521154
date_published=self.date_published,
11531155
weaknesses=self.weaknesses,

vulnerabilities/tests/test_default_improver.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from vulnerabilities.importer import Reference
1818
from vulnerabilities.improver import Inference
1919
from vulnerabilities.improvers.default import DefaultImprover
20+
from vulnerabilities.improvers.default import get_exact_purls
2021
from vulnerabilities.tests import util_tests
2122

2223
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
@@ -136,3 +137,29 @@ def test_default_improver_with_nvd():
136137
for data in list(default_improver.get_inferences(AdvisoryData.from_dict(advisory_data)))
137138
]
138139
util_tests.check_results_against_json(result, expected_file)
140+
141+
142+
def test_AffectedPackage_from_dict_should_not_crash_with_invalid_version_range():
143+
package = PackageURL(
144+
type="rpm",
145+
namespace="rpms",
146+
name="python",
147+
qualifiers={},
148+
subpath=None,
149+
)
150+
151+
test_ranges = [
152+
# foo is a non-existing range
153+
"vers:foo/1.2.3",
154+
# apache was not supported and returned from vulnerabilities.importers.apache_httpd.ApacheHTTPDImporter
155+
"vers:apache/",
156+
None,
157+
]
158+
for tr in test_ranges:
159+
pkg = {
160+
"package": package.to_dict(),
161+
"affected_version_range": tr,
162+
"fixed_version": None,
163+
}
164+
165+
assert AffectedPackage.from_dict(pkg) is None

0 commit comments

Comments
 (0)