Skip to content

Commit f758312

Browse files
authored
feat(checker): allow to disable language checker (#5049)
Allow the user to enable or disable language checkers While at it, also fix a typo dictoinary -> dictionary Signed-off-by: Fabrice Fontaine <[email protected]>
1 parent 6f225ee commit f758312

File tree

2 files changed

+58
-6
lines changed

2 files changed

+58
-6
lines changed

cve_bin_tool/cli.py

+29-1
Original file line numberDiff line numberDiff line change
@@ -992,7 +992,6 @@ def main(argv=None):
992992
raise FileNotFoundError("Directory/File doesn't exist")
993993

994994
# Checkers related settings
995-
skips = args["skips"]
996995
if args["runs"]:
997996
runs = args["runs"]
998997
skips = list(
@@ -1004,6 +1003,34 @@ def main(argv=None):
10041003
),
10051004
)
10061005
)
1006+
language_skips = list(
1007+
map(
1008+
lambda checker_name: checker_name,
1009+
filter(
1010+
lambda checker_name: checker_name not in runs,
1011+
VersionScanner.available_language_checkers(),
1012+
),
1013+
)
1014+
)
1015+
else:
1016+
skips = list(
1017+
map(
1018+
lambda checker_name: checker_name,
1019+
filter(
1020+
lambda checker_name: checker_name in args["skips"],
1021+
VersionScanner.available_checkers(),
1022+
),
1023+
)
1024+
)
1025+
language_skips = list(
1026+
map(
1027+
lambda checker_name: checker_name,
1028+
filter(
1029+
lambda checker_name: checker_name in args["skips"],
1030+
VersionScanner.available_language_checkers(),
1031+
),
1032+
)
1033+
)
10071034

10081035
if (
10091036
not args["input_file"]
@@ -1098,6 +1125,7 @@ def main(argv=None):
10981125
version_scanner.remove_skiplist(skips)
10991126
LOGGER.info(f"Number of checkers: {version_scanner.number_of_checkers()}")
11001127
version_scanner.print_checkers()
1128+
version_scanner.remove_language_skiplist(language_skips)
11011129
LOGGER.debug(
11021130
"If the checkers aren’t loading properly: https://cve-bin-tool.readthedocs.io/en/latest/CONTRIBUTING.html#help-my-checkers-aren-t-loading"
11031131
)

cve_bin_tool/version_scanner.py

+29-5
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ def __init__(
6969
self.cve_db = CVEDB(sources=sources)
7070
self.validate = validate
7171
# self.logger.info("Checkers loaded: %s" % (", ".join(self.checkers.keys())))
72-
self.language_checkers = self.available_language_checkers()
72+
self.language_checkers = valid_files
73+
self.language_checkers_names = self.available_language_checkers()
7374

7475
@classmethod
7576
def load_checkers(cls) -> dict[str, type[Checker]]:
@@ -115,7 +116,7 @@ def remove_skiplist(self, skips: list[str]) -> None:
115116
self.logger.error(f"Checker {skipme} is not a valid checker name")
116117

117118
def print_checkers(self) -> None:
118-
"""Print checkers and logs an informational message that lists the names of the checkers stored in the dictoionary"""
119+
"""Print checkers and logs an informational message that lists the names of the checkers stored in the dictionary"""
119120

120121
self.logger.info(f'Checkers: {", ".join(self.checkers.keys())}')
121122

@@ -131,13 +132,36 @@ def available_language_checkers(cls) -> list[str]:
131132
"""Find Language checkers"""
132133
return sorted(available_parsers)
133134

135+
def remove_language_skiplist(self, language_skips: list[str]) -> None:
136+
"""Remove specific language checkers If a checker is in the skip list, it will be removed from this dictionary. If it's not found or is not a valid language checker name, it logs error messages."""
137+
138+
# Take out any language checkers that are on the skip list
139+
# (string of comma-delimited language checker names)
140+
skiplist = language_skips
141+
for skipme in skiplist:
142+
if skipme not in self.language_checkers_names:
143+
self.logger.error(
144+
f"Checker {skipme} is not a valid language checker name"
145+
)
146+
else:
147+
self.logger.debug(f"Skipping language checker: {skipme}")
148+
self.language_checkers_names.remove(skipme)
149+
for checker in list(self.language_checkers.keys()):
150+
if (
151+
skipme
152+
in self.language_checkers[checker][0].__module__.split(".")[2]
153+
):
154+
del self.language_checkers[checker]
155+
134156
def print_language_checkers(self) -> None:
135157
"""Logs the message that lists the names of the language checkers"""
136-
self.logger.info(f'Language Checkers: {", ".join(self.language_checkers)}')
158+
self.logger.info(
159+
f'Language Checkers: {", ".join(self.language_checkers_names)}'
160+
)
137161

138162
def number_of_language_checkers(self) -> int:
139163
"""return the number of language checkers available"""
140-
return len(self.language_checkers)
164+
return len(self.language_checkers_names)
141165

142166
def is_executable(self, filename: str) -> tuple[bool, str | None]:
143167
"""check if file is an ELF binary file"""
@@ -238,7 +262,7 @@ def scan_file(self, filename: str) -> Iterator[ScanInfo]:
238262

239263
if output:
240264
valid_file = False
241-
for file in list(valid_files.keys()):
265+
for file in list(self.language_checkers.keys()):
242266
valid_file = valid_file | (file in output)
243267
if valid_file:
244268
for scan_info in parse(filename, output, self.cve_db, self.logger):

0 commit comments

Comments
 (0)