Skip to content

fix: Too many SQL Variables #1279

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 18 commits into from
Jul 27, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 39 additions & 27 deletions cve_bin_tool/cve_scanner.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,36 +159,48 @@ def get_cves(self, product_info: ProductInfo, triage_data: TriageData):

# Go through and get all the severities
if cve_list:
query = f"""
SELECT CVE_number, severity, description, score, cvss_version, cvss_vector
FROM cve_severity
WHERE CVE_number IN ({",".join(["?"] * len(cve_list))}) AND score >= ?
ORDER BY CVE_number
"""
# Add score parameter to tuple listing CVEs to pass to query
cve_list.append(self.score)

result = self.cursor.execute(query, cve_list)

cves: List[CVE] = []
for row in result:
triage = triage_data.get(row["cve_number"]) or triage_data.get(
"default"
)
# Only scan cves if triage is not None.
# Triage will only be None if triage_data don't have default attribute.
# NOTE: Triage can be empty dictionary so checking `if triage:` won't suffice.
if triage is not None:
row_dict = dict(row)
row_dict.update(triage)
# print(row_dict)
row_dict["severity"] = row_dict["severity"] or row["severity"]
row_dict["score"] = row_dict["score"] or row["score"]
row_dict["cvss_version"] = (
row_dict["cvss_version"] or row["cvss_version"]
finished = False
max_cves = 500
remaining = len(cve_list)
start = 0

while not finished:
# Limit number of CVEs in single query to maximum
number_of_cves = min(remaining, max_cves)
end = start + number_of_cves
remaining = remaining - number_of_cves
finished = remaining == 0

query = f"""
SELECT CVE_number, severity, description, score, cvss_version, cvss_vector
FROM cve_severity
WHERE CVE_number IN ({",".join(["?"] * number_of_cves)}) AND score >= ?
ORDER BY CVE_number
"""
# Add score parameter to tuple listing CVEs to pass to query
result = self.cursor.execute(query, cve_list[start:end] + [self.score])
start = end

for row in result:
triage = triage_data.get(row["cve_number"]) or triage_data.get(
"default"
)
cve = CVE(**row_dict)
cves.append(cve)
# Only scan cves if triage is not None.
# Triage will only be None if triage_data don't have default attribute.
# NOTE: Triage can be empty dictionary so checking `if triage:` won't suffice.
if triage is not None:
row_dict = dict(row)
row_dict.update(triage)
# print(row_dict)
row_dict["severity"] = row_dict["severity"] or row["severity"]
row_dict["score"] = row_dict["score"] or row["score"]
row_dict["cvss_version"] = (
row_dict["cvss_version"] or row["cvss_version"]
)
cve = CVE(**row_dict)
cves.append(cve)

if cves:
self.products_with_cve += 1
Expand Down