Skip to content

Commit 62be065

Browse files
committed
fix(deps): reject --dep-* values outside yes/no
1 parent 7a86385 commit 62be065

2 files changed

Lines changed: 60 additions & 9 deletions

File tree

share/gen-sbom

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1461,6 +1461,25 @@ def _inherit_wolfcrypt_version(enabled_deps, overrides, name, version):
14611461
elif name.lower() == 'wolfssl':
14621462
overrides['wolfcrypt'] = version
14631463
return overrides
1464+
def _enabled_deps(dep_flags):
1465+
"""Return the enabled dependency keys, rejecting values outside {yes, no}.
1466+
1467+
Treating anything that is not 'yes' as 'no' loses a dependency silently.
1468+
A build fragment wiring `--dep-wolfssl=$(HAVE_WOLFSSL)` where the variable
1469+
expands to 1, true, on or Y would drop a CVE-bearing component from the
1470+
SBOM with no diagnostic, which is the one failure mode a CRA tool must
1471+
never have. Fail loudly instead.
1472+
"""
1473+
enabled = []
1474+
for key, flag_name, value in dep_flags:
1475+
normalized = (value or '').strip().lower()
1476+
if normalized not in ('yes', 'no'):
1477+
sys.exit(f"ERROR: {flag_name} expects 'yes' or 'no', got {value!r}. "
1478+
f"A value outside that set would silently drop {key} from "
1479+
f"the SBOM.")
1480+
if normalized == 'yes':
1481+
enabled.append(key)
1482+
return enabled
14641483

14651484

14661485
def main():
@@ -1646,15 +1665,12 @@ def main():
16461665
"https://example.com/sbom/wolfssl-X.Y.Z.spdx.json or "
16471666
"urn:uuid:00000000-0000-0000-0000-000000000000.")
16481667

1649-
enabled_deps = [
1650-
key for key, flag in [
1651-
('wolfssl', args.dep_wolfssl),
1652-
('wolfcrypt', args.dep_wolfcrypt),
1653-
('openssl', args.dep_openssl),
1654-
('libz', args.dep_libz),
1655-
]
1656-
if flag.lower() == 'yes'
1657-
]
1668+
enabled_deps = _enabled_deps([
1669+
('wolfssl', '--dep-wolfssl', args.dep_wolfssl),
1670+
('wolfcrypt', '--dep-wolfcrypt', args.dep_wolfcrypt),
1671+
('openssl', '--dep-openssl', args.dep_openssl),
1672+
('libz', '--dep-libz', args.dep_libz),
1673+
])
16581674
dep_version_overrides = _parse_dep_version_overrides(args.dep_version)
16591675
# Resolve each enabled dependency's version once, here, and feed the
16601676
# result to both the CDX and SPDX emitters via the overrides map (see

tests/test_gen_sbom.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3028,3 +3028,38 @@ def test_inherited_version_yields_a_resolvable_cpe(self):
30283028
self.assertEqual(
30293029
comp['cpe'], 'cpe:2.3:a:wolfssl:wolfcrypt:5.9.1:*:*:*:*:*:*:*')
30303030
self.assertEqual(len(comp['cpe'].split(':')), 13)
3031+
class TestEnabledDepsValidation(unittest.TestCase):
3032+
"""--dep-* must be exactly yes or no.
3033+
3034+
Anything else was previously treated as 'no', so a fragment wiring
3035+
--dep-wolfssl=$(HAVE_WOLFSSL) where the variable expands to 1/true/on/Y
3036+
dropped a CVE-bearing component with no diagnostic.
3037+
"""
3038+
3039+
def test_yes_enables_and_no_disables(self):
3040+
self.assertEqual(
3041+
gs._enabled_deps([('wolfssl', '--dep-wolfssl', 'yes'),
3042+
('libz', '--dep-libz', 'no')]),
3043+
['wolfssl'])
3044+
3045+
def test_case_and_surrounding_space_tolerated(self):
3046+
self.assertEqual(
3047+
gs._enabled_deps([('wolfssl', '--dep-wolfssl', ' YES ')]),
3048+
['wolfssl'])
3049+
3050+
def test_truthy_lookalikes_are_rejected_not_silently_dropped(self):
3051+
for bogus in ('1', 'true', 'on', 'Y', 'enabled'):
3052+
with self.subTest(value=bogus):
3053+
with self.assertRaises(SystemExit):
3054+
gs._enabled_deps([('wolfssl', '--dep-wolfssl', bogus)])
3055+
3056+
def test_empty_is_rejected(self):
3057+
with self.assertRaises(SystemExit):
3058+
gs._enabled_deps([('wolfssl', '--dep-wolfssl', '')])
3059+
3060+
def test_order_follows_declaration_not_input(self):
3061+
self.assertEqual(
3062+
gs._enabled_deps([('wolfssl', '--dep-wolfssl', 'yes'),
3063+
('wolfcrypt', '--dep-wolfcrypt', 'yes'),
3064+
('libz', '--dep-libz', 'yes')]),
3065+
['wolfssl', 'wolfcrypt', 'libz'])

0 commit comments

Comments
 (0)