[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