[Openvas-commits] r9402 - in trunk/openvas-manager: . src
scm-commit@wald.intevation.org
scm-commit at wald.intevation.org
Fri Nov 12 22:47:36 CET 2010
Author: mattm
Date: 2010-11-12 22:47:34 +0100 (Fri, 12 Nov 2010)
New Revision: 9402
Modified:
trunk/openvas-manager/ChangeLog
trunk/openvas-manager/src/manage_sql.c
Log:
* src/manage_sql.c (report_counts_id): If all levels are required count
them all in one go, using the three part select from report_count.
Modified: trunk/openvas-manager/ChangeLog
===================================================================
--- trunk/openvas-manager/ChangeLog 2010-11-12 21:31:26 UTC (rev 9401)
+++ trunk/openvas-manager/ChangeLog 2010-11-12 21:47:34 UTC (rev 9402)
@@ -1,5 +1,10 @@
2010-11-12 Matthew Mundell <matthew.mundell at greenbone.net>
+ * src/manage_sql.c (report_counts_id): If all levels are required count
+ them all in one go, using the three part select from report_count.
+
+2010-11-12 Matthew Mundell <matthew.mundell at greenbone.net>
+
* src/manage_sql.c (report_count): Put the zero comparisons first in the
overrides select.
Modified: trunk/openvas-manager/src/manage_sql.c
===================================================================
--- trunk/openvas-manager/src/manage_sql.c 2010-11-12 21:31:26 UTC (rev 9401)
+++ trunk/openvas-manager/src/manage_sql.c 2010-11-12 21:47:34 UTC (rev 9402)
@@ -9339,16 +9339,336 @@
int* logs, int* warnings, int* false_positives, int override,
const char *host)
{
+ /* These add time and are out of scope of OMP threat levels, so skip them. */
+ if (debugs)
+ *debugs = 0;
+ if (false_positives)
+ *false_positives = 0;
+
+ if (holes && infos && logs && warnings)
+ {
+ if (override
+ && sql_int (0, 0,
+ "SELECT count(*)"
+ " FROM overrides"
+ " WHERE (overrides.owner IS NULL)"
+ " OR (overrides.owner ="
+ " (SELECT ROWID FROM users"
+ " WHERE users.uuid = '%s'))",
+ current_credentials.uuid))
+ {
+ iterator_t results;
+ task_t task;
+
+ sqlite3_stmt *stmt, *full_stmt;
+ gchar *select;
+ int ret;
+
+ /* Prepare quick inner statement. */
+
+ select = g_strdup_printf ("SELECT 1 FROM overrides"
+ " WHERE (overrides.nvt = $nvt)"
+ " AND ((overrides.owner IS NULL) OR (overrides.owner ="
+ " (SELECT ROWID FROM users WHERE users.uuid = '%s')))",
+ current_credentials.uuid);
+ while (1)
+ {
+ const char* tail;
+ ret = sqlite3_prepare (task_db, select, -1, &stmt, &tail);
+ if (ret == SQLITE_BUSY) continue;
+ g_free (select);
+ if (ret == SQLITE_OK)
+ {
+ if (stmt == NULL)
+ {
+ g_warning ("%s: sqlite3_prepare failed with NULL stmt: %s\n",
+ __FUNCTION__,
+ sqlite3_errmsg (task_db));
+ abort ();
+ }
+ break;
+ }
+ g_warning ("%s: sqlite3_prepare failed: %s\n",
+ __FUNCTION__,
+ sqlite3_errmsg (task_db));
+ /** @todo ROLLBACK if in transaction. */
+ abort ();
+ }
+
+ /* Prepare full inner statement. */
+
+ report_task (report, &task);
+
+ select = g_strdup_printf
+ ("SELECT overrides.new_threat"
+ " FROM overrides"
+ " WHERE overrides.nvt = $nvt" // 1
+ " AND ((overrides.owner IS NULL)"
+ " OR (overrides.owner ="
+ " (SELECT users.ROWID FROM users"
+ " WHERE users.uuid = '%s')))"
+ " AND (overrides.task = 0"
+ " OR overrides.task = %llu)"
+ " AND (overrides.result = 0"
+ " OR overrides.result = $result)" // 2
+ " AND (overrides.hosts is NULL"
+ " OR overrides.hosts = \"\""
+ " OR hosts_contains (overrides.hosts, $host))" // 3
+ " AND (overrides.port is NULL"
+ " OR overrides.port = \"\""
+ " OR overrides.port = $port)" // 4
+ " AND (overrides.threat is NULL"
+ " OR overrides.threat = \"\""
+ " OR overrides.threat = $type)" // 5
+ " ORDER BY overrides.result DESC, overrides.task DESC,"
+ " overrides.port DESC, overrides.threat"
+ " COLLATE collate_message_type ASC;",
+ current_credentials.uuid,
+ task);
+
+ while (1)
+ {
+ const char* tail;
+ ret = sqlite3_prepare (task_db, select, -1, &full_stmt, &tail);
+ if (ret == SQLITE_BUSY) continue;
+ g_free (select);
+ if (ret == SQLITE_OK)
+ {
+ if (full_stmt == NULL)
+ {
+ g_warning ("%s: sqlite3_prepare failed with NULL stmt: %s\n",
+ __FUNCTION__,
+ sqlite3_errmsg (task_db));
+ abort ();
+ }
+ break;
+ }
+ g_warning ("%s: sqlite3_prepare failed: %s\n",
+ __FUNCTION__,
+ sqlite3_errmsg (task_db));
+ /** @todo ROLLBACK if in transaction. */
+ abort ();
+ }
+
+ /* Loop through all results. */
+
+ *debugs = *holes = *infos = *logs = *warnings = 0;
+ init_iterator (&results,
+ "SELECT results.ROWID, results.nvt, results.type,"
+ " results.host, results.port"
+ " FROM results, report_results"
+ " WHERE report_results.report = %llu"
+ " AND results.ROWID = report_results.result",
+ report);
+ while (next (&results))
+ {
+ const char *nvt, *new_type;
+
+ nvt = (const char*) sqlite3_column_text (results.stmt, 1);
+
+ /* Bind the current result values into the quick statement. */
+
+ while (1)
+ {
+ ret = sqlite3_bind_text (stmt, 1, nvt, -1, SQLITE_TRANSIENT);
+ if (ret == SQLITE_BUSY) continue;
+ if (ret == SQLITE_OK) break;
+ g_warning ("%s: sqlite3_prepare failed: %s\n",
+ __FUNCTION__,
+ sqlite3_errmsg (task_db));
+ abort ();
+ }
+
+ /* Run the quick inner statement to check for overrides. */
+
+ while (1)
+ {
+ ret = sqlite3_step (stmt);
+ if (ret == SQLITE_BUSY) continue;
+ if (ret == SQLITE_DONE) break;
+ if (ret == SQLITE_ERROR || ret == SQLITE_MISUSE)
+ {
+ if (ret == SQLITE_ERROR) ret = sqlite3_reset (stmt);
+ g_warning ("%s: sqlite3_step failed: %s\n",
+ __FUNCTION__,
+ sqlite3_errmsg (task_db));
+ abort ();
+ }
+ break;
+ }
+
+ /* Check the result. */
+
+ if (ret == SQLITE_DONE)
+ {
+ new_type = (const char*) sqlite3_column_text (results.stmt, 2);
+ if (new_type)
+ {
+ if (strcmp (new_type, "Security Hole") == 0)
+ (*holes)++;
+ else if (strcmp (new_type, "Security Warning") == 0)
+ (*warnings)++;
+ else if (strcmp (new_type, "Security Note") == 0)
+ (*infos)++;
+ else if (strcmp (new_type, "Log Message") == 0)
+ (*logs)++;
+ }
+ }
+ else
+ {
+ /* There is an override on this NVT, get the new threat value. */
+
+ /* Bind the current result values into the full statement. */
+
+ while (1)
+ {
+ ret = sqlite3_bind_text (full_stmt, 1, nvt, -1, SQLITE_TRANSIENT);
+ if (ret == SQLITE_BUSY) continue;
+ if (ret == SQLITE_OK) break;
+ g_warning ("%s: sqlite3_prepare failed: %s\n",
+ __FUNCTION__,
+ sqlite3_errmsg (task_db));
+ abort ();
+ }
+
+ while (1)
+ {
+ result_t result;
+ result = (result_t) sqlite3_column_int64 (results.stmt, 0);
+ ret = sqlite3_bind_int64 (full_stmt, 2, result);
+ if (ret == SQLITE_BUSY) continue;
+ if (ret == SQLITE_OK) break;
+ g_warning ("%s: sqlite3_prepare failed: %s\n",
+ __FUNCTION__,
+ sqlite3_errmsg (task_db));
+ abort ();
+ }
+
+ while (1)
+ {
+ const char *host;
+ host = (const char*) sqlite3_column_text (results.stmt, 3);
+ ret = sqlite3_bind_text (full_stmt, 3, host, -1,
+ SQLITE_TRANSIENT);
+ if (ret == SQLITE_BUSY) continue;
+ if (ret == SQLITE_OK) break;
+ g_warning ("%s: sqlite3_prepare failed: %s\n",
+ __FUNCTION__,
+ sqlite3_errmsg (task_db));
+ abort ();
+ }
+
+ while (1)
+ {
+ const char *port;
+ port = (const char*) sqlite3_column_text (results.stmt, 4);
+ ret = sqlite3_bind_text (full_stmt, 4, port, -1,
+ SQLITE_TRANSIENT);
+ if (ret == SQLITE_BUSY) continue;
+ if (ret == SQLITE_OK) break;
+ g_warning ("%s: sqlite3_prepare failed: %s\n",
+ __FUNCTION__,
+ sqlite3_errmsg (task_db));
+ abort ();
+ }
+
+ while (1)
+ {
+ const char *type;
+ type = (const char*) sqlite3_column_text (results.stmt, 2);
+ ret = sqlite3_bind_text (full_stmt, 5, type, -1,
+ SQLITE_TRANSIENT);
+ if (ret == SQLITE_BUSY) continue;
+ if (ret == SQLITE_OK) break;
+ g_warning ("%s: sqlite3_prepare failed: %s\n",
+ __FUNCTION__,
+ sqlite3_errmsg (task_db));
+ abort ();
+ }
+
+ /* Run the full inner statement. */
+
+ while (1)
+ {
+ ret = sqlite3_step (full_stmt);
+ if (ret == SQLITE_BUSY) continue;
+ if (ret == SQLITE_DONE) break;
+ if (ret == SQLITE_ERROR || ret == SQLITE_MISUSE)
+ {
+ if (ret == SQLITE_ERROR) ret = sqlite3_reset (full_stmt);
+ g_warning ("%s: sqlite3_step failed: %s\n",
+ __FUNCTION__,
+ sqlite3_errmsg (task_db));
+ abort ();
+ }
+ break;
+ }
+
+ /* Check the result. */
+
+ if (ret == SQLITE_DONE)
+ new_type = (const char*) sqlite3_column_text (results.stmt, 2);
+ else
+ new_type = (const char*) sqlite3_column_text (full_stmt, 0);
+
+ if (new_type)
+ {
+ if (strcmp (new_type, "Security Hole") == 0)
+ (*holes)++;
+ else if (strcmp (new_type, "Security Warning") == 0)
+ (*warnings)++;
+ else if (strcmp (new_type, "Security Note") == 0)
+ (*infos)++;
+ else if (strcmp (new_type, "Log Message") == 0)
+ (*logs)++;
+ }
+
+ /* Reset the full inner statement. */
+
+ while (1)
+ {
+ ret = sqlite3_reset (full_stmt);
+ if (ret == SQLITE_BUSY) continue;
+ if (ret == SQLITE_DONE || ret == SQLITE_OK) break;
+ if (ret == SQLITE_ERROR || ret == SQLITE_MISUSE)
+ {
+ g_warning ("%s: sqlite3_reset failed: %s\n",
+ __FUNCTION__,
+ sqlite3_errmsg (task_db));
+ abort ();
+ }
+ }
+ }
+
+ /* Reset the quick inner statement. */
+
+ while (1)
+ {
+ ret = sqlite3_reset (stmt);
+ if (ret == SQLITE_BUSY) continue;
+ if (ret == SQLITE_DONE || ret == SQLITE_OK) break;
+ if (ret == SQLITE_ERROR || ret == SQLITE_MISUSE)
+ {
+ g_warning ("%s: sqlite3_reset failed: %s\n",
+ __FUNCTION__,
+ sqlite3_errmsg (task_db));
+ abort ();
+ }
+ }
+ }
+ cleanup_iterator (&results);
+ sqlite3_finalize (stmt);
+
+ return 0;
+ }
+ }
+
if (holes) *holes = report_count (report, "Security Hole", override, host);
if (infos) *infos = report_count (report, "Security Note", override, host);
if (logs) *logs = report_count (report, "Log Message", override, host);
if (warnings)
*warnings = report_count (report, "Security Warning", override, host);
- /* These add time and are out of scope of OMP threat levels, so skip them. */
- if (debugs)
- *debugs = 0;
- if (false_positives)
- *false_positives = 0;
+
return 0;
}
More information about the Openvas-commits
mailing list