Skip to content

Commit 36d7bff

Browse files
Fix OVAL version ranges for non-zero epochs
Only strip a leading epoch 0 from an OVAL version. The previous string replacement removed every "0:" substring, corrupting bounds such as 10:4.14-1.1 into 14.14-1.1. Signed-off-by: Ashutosh Panda <ashutoshpanda.india@gmail.com>
1 parent faab557 commit 36d7bff

2 files changed

Lines changed: 29 additions & 3 deletions

File tree

‎vulnerabilities/oval_parser.py‎

100755100644
Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,15 @@ def get_version_range_from_state(self, state: OvalState) -> Optional[str]:
136136
version = var.text or ""
137137
if not version:
138138
continue
139+
140+
# 0: is the default epoch, so remove it only when it is the
141+
# leading epoch of the version. Any other "0:" is part of the
142+
# version and must be kept as is.
143+
if version.startswith("0:"):
144+
version = version[2:]
145+
139146
version_range = operand + version
140147
version_range = version_range.replace("only", "").strip()
141-
142-
# 0: is default epoch, remove it
143-
version_range = version_range.replace("0:", "").strip()
144148
x_version_ranges = {
145149
"<2.0.x": "2.0.x",
146150
"<3.x": "3.x",

‎vulnerabilities/tests/test_suse_oval.py‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
from vulnerabilities.importers.suse_oval import SuseOvalImporter
1717
from vulnerabilities.importers.suse_oval import filter
18+
from vulnerabilities.lib_oval import OvalState
1819
from vulnerabilities.oval_parser import OvalParser
1920
from vulnerabilities.tests import util_tests
2021

@@ -99,6 +100,27 @@ def test_suse_oval_parse_CVE_2008_5679():
99100
assert def0_urls == parsed_oval.get_urls_from_definition(definition_0)
100101

101102

103+
def test_get_version_range_from_state_only_strips_leading_epoch_zero():
104+
xml_doc = ET.parse(os.path.join(TEST_DATA, "org.opensuse.CVE-2008-5679.xml"))
105+
translations = {"less than": "<", "equals": "=", "greater than or equal": ">="}
106+
parsed_oval = OvalParser(translations, xml_doc)
107+
108+
cases = [
109+
("0:4.14-1.1", "<4.14-1.1"),
110+
("1:4.14-1.1", "<1:4.14-1.1"),
111+
("10:4.14-1.1", "<10:4.14-1.1"),
112+
("20:4.14-1.1", "<20:4.14-1.1"),
113+
("0:10:2.0-1", "<10:2.0-1"),
114+
("4.0:14-1", "<4.0:14-1"),
115+
]
116+
for version, expected_range in cases:
117+
state_element = ET.Element("rpminfo_state")
118+
evr_element = ET.SubElement(state_element, "evr", {"operation": "less than"})
119+
evr_element.text = version
120+
121+
assert parsed_oval.get_version_range_from_state(OvalState(state_element)) == expected_range
122+
123+
102124
def test_filter_suse_gz_files():
103125
initial_suse_gz_files = [
104126
"https://ftp.suse.com/pub/projects/security/oval/suse.openstack.cloud.7-affected.xml.gz",

0 commit comments

Comments
 (0)