Author: timopollmeier Date: 2017-08-09 15:23:23 +0200 (Wed, 09 Aug 2017) New Revision: 29329
Modified: branches/openvas-manager-7.0/ChangeLog branches/openvas-manager-7.0/src/manage.c branches/openvas-manager-7.0/src/manage.h branches/openvas-manager-7.0/src/manage_sql.c branches/openvas-manager-7.0/src/ompd.c branches/openvas-manager-7.0/src/openvasmd.c branches/openvas-manager-7.0/src/sql.h branches/openvas-manager-7.0/src/sql_pg.c branches/openvas-manager-7.0/src/sql_sqlite3.c Log: Backport r28922 and r28923. Handle termination signals outside the main serve_and_schedule loop by canceling SQL statements and closing scanner connections. * src/manage_sql.c (sql_cancel): New function. * src/manage.c (handle_slave_task): Stop current task if a termination signal was received. (get_termination_signal): New function. * src/manage.h (get_termination_signal, sql_cancel): New prototypes. * src/ompd.c (serve_omp): Close scanner connection and exit loop if a termination signal was received. * src/openvasmd.c (handle_termination_signal): Call sql_cancel. * src/sql_pg.c (sql_cancel_internal): New function. * src/sql_sqlite3.c (sql_cancel_internal): New function. * src/sql.h (sql_cancel_internal): New function prototype. Modified: branches/openvas-manager-7.0/ChangeLog =================================================================== --- branches/openvas-manager-7.0/ChangeLog 2017-08-09 11:43:15 UTC (rev 29328) +++ branches/openvas-manager-7.0/ChangeLog 2017-08-09 13:23:23 UTC (rev 29329) @@ -1,3 +1,29 @@ +2017-08-09 Timo Pollmeier <timo.pollme...@greenbone.net> + + Backport r28922 and r28923. + + Handle termination signals outside the main serve_and_schedule loop by + canceling SQL statements and closing scanner connections. + + * src/manage_sql.c (sql_cancel): New function. + + * src/manage.c (handle_slave_task): Stop current task if a termination + signal was received. + (get_termination_signal): New function. + + * src/manage.h (get_termination_signal, sql_cancel): New prototypes. + + * src/ompd.c (serve_omp): Close scanner connection and exit loop if a + termination signal was received. + + * src/openvasmd.c (handle_termination_signal): Call sql_cancel. + + * src/sql_pg.c (sql_cancel_internal): New function. + + * src/sql_sqlite3.c (sql_cancel_internal): New function. + + * src/sql.h (sql_cancel_internal): New function prototype. + 2017-08-07 Matthew Mundell <matthew.mund...@greenbone.net> Backport r29325. Modified: branches/openvas-manager-7.0/src/manage.c =================================================================== --- branches/openvas-manager-7.0/src/manage.c 2017-08-09 11:43:15 UTC (rev 29328) +++ branches/openvas-manager-7.0/src/manage.c 2017-08-09 13:23:23 UTC (rev 29329) @@ -156,6 +156,9 @@ */ #define MAX_HOSTS_DEFAULT "20" +extern volatile int termination_signal; + + /* Certificate and key management. */ @@ -3473,9 +3476,22 @@ } else { + int termination_signal = get_termination_signal (); if ((task_run_status (task) == TASK_STATUS_STOP_REQUESTED_GIVEUP) - || (task_run_status (task) == TASK_STATUS_STOP_REQUESTED)) + || (task_run_status (task) == TASK_STATUS_STOP_REQUESTED) + || termination_signal) { + if (termination_signal) + { + g_debug ("%s: Received %s signal.", + __FUNCTION__, + sys_siglist[get_termination_signal()]); + } + if (current_report) + { + set_report_scan_run_status (current_report, + TASK_STATUS_STOPPED); + } set_task_run_status (task, TASK_STATUS_STOPPED); g_free (slave_task_name); return 0; @@ -3485,6 +3501,22 @@ while (1) { + int termination_signal = get_termination_signal (); + if (termination_signal) + { + g_debug ("%s: Received %s signal.", + __FUNCTION__, + sys_siglist[get_termination_signal()]); + if (current_report) + { + set_report_scan_run_status (current_report, + TASK_STATUS_STOPPED); + } + set_task_run_status (task, TASK_STATUS_STOPPED); + g_free (slave_task_name); + return 0; + } + ret = slave_setup (connection, slave_task_name, task, target, target_ssh_credential, target_smb_credential, target_esxi_credential, @@ -9429,3 +9461,14 @@ return 3; return 0; } + +/** + * @brief Gets the last termination signal or 0. + * + * @return The last termination signal or 0 if there was none. + */ +int +get_termination_signal () +{ + return termination_signal; +} Modified: branches/openvas-manager-7.0/src/manage.h =================================================================== --- branches/openvas-manager-7.0/src/manage.h 2017-08-09 11:43:15 UTC (rev 29328) +++ branches/openvas-manager-7.0/src/manage.h 2017-08-09 13:23:23 UTC (rev 29329) @@ -4178,4 +4178,12 @@ int manage_optimize (GSList *, const gchar *, const gchar *); +/* Signal management */ + +int +get_termination_signal (); + +int +sql_cancel (); + #endif /* not OPENVAS_MANAGER_MANAGE_H */ Modified: branches/openvas-manager-7.0/src/manage_sql.c =================================================================== --- branches/openvas-manager-7.0/src/manage_sql.c 2017-08-09 11:43:15 UTC (rev 29328) +++ branches/openvas-manager-7.0/src/manage_sql.c 2017-08-09 13:23:23 UTC (rev 29329) @@ -66510,3 +66510,15 @@ return ret; } + +/** + * @brief Cancels the current SQL statement. + * + * @return 0 on success, -1 on error. + */ +int +sql_cancel () +{ + g_debug ("%s: cancelling current SQL statement", __FUNCTION__); + return sql_cancel_internal (); +} Modified: branches/openvas-manager-7.0/src/ompd.c =================================================================== --- branches/openvas-manager-7.0/src/ompd.c 2017-08-09 11:43:15 UTC (rev 29328) +++ branches/openvas-manager-7.0/src/ompd.c 2017-08-09 13:23:23 UTC (rev 29329) @@ -556,7 +556,22 @@ { int ret; fd_set readfds, writefds; + int termination_signal = get_termination_signal (); + if (termination_signal) + { + g_debug ("%s: Received %s signal.", + __FUNCTION__, + sys_siglist[get_termination_signal()]); + + if (openvas_scanner_connected ()) + { + openvas_scanner_close (); + } + + goto client_free; + } + /* Setup for select. */ /** @todo nfds must only include a socket if it's in >= one set. */ Modified: branches/openvas-manager-7.0/src/openvasmd.c =================================================================== --- branches/openvas-manager-7.0/src/openvasmd.c 2017-08-09 11:43:15 UTC (rev 29328) +++ branches/openvas-manager-7.0/src/openvasmd.c 2017-08-09 13:23:23 UTC (rev 29329) @@ -868,6 +868,8 @@ handle_termination_signal (int signal) { termination_signal = signal; + + sql_cancel (); } /** Modified: branches/openvas-manager-7.0/src/sql.h =================================================================== --- branches/openvas-manager-7.0/src/sql.h 2017-08-09 11:43:15 UTC (rev 29328) +++ branches/openvas-manager-7.0/src/sql.h 2017-08-09 13:23:23 UTC (rev 29329) @@ -207,4 +207,7 @@ long long int sql_column_int64 (sql_stmt_t *, int); +int +sql_cancel_internal (); + #endif /* not OPENVAS_MANAGER_SQL_H */ Modified: branches/openvas-manager-7.0/src/sql_pg.c =================================================================== --- branches/openvas-manager-7.0/src/sql_pg.c 2017-08-09 11:43:15 UTC (rev 29328) +++ branches/openvas-manager-7.0/src/sql_pg.c 2017-08-09 13:23:23 UTC (rev 29329) @@ -245,10 +245,11 @@ PostgresPollingStatusType poll_status; int socket; - conn_info = g_strdup_printf ("dbname = %s", + conn_info = g_strdup_printf ("dbname='%s' application_name='%s'", database ? database - : sql_default_database ()); + : sql_default_database (), + "gvmd"); conn = PQconnectStart (conn_info); g_free (conn_info); if (conn == NULL) @@ -928,3 +929,35 @@ return atol (cell); } } + +/** + * @brief Cancels the current SQL statement. + * + * @return 0 on success, -1 on error. + */ +int +sql_cancel_internal () +{ + PGcancel *cancel; + char errbuf[256] = ""; + + cancel = PQgetCancel (conn); + if (cancel) + { + if (PQcancel (cancel, errbuf, 256)) + { + PQfreeCancel (cancel); + } + else + { + PQfreeCancel (cancel); + return -1; + } + } + else + { + return -1; + } + + return 0; +} Modified: branches/openvas-manager-7.0/src/sql_sqlite3.c =================================================================== --- branches/openvas-manager-7.0/src/sql_sqlite3.c 2017-08-09 11:43:15 UTC (rev 29328) +++ branches/openvas-manager-7.0/src/sql_sqlite3.c 2017-08-09 13:23:23 UTC (rev 29329) @@ -886,3 +886,22 @@ { return sqlite3_column_int64 (stmt->stmt, position); } + +/** + * @brief Cancels the current SQL statement. + * + * @return 0 on success, -1 on error. + */ +int +sql_cancel_internal () +{ + if (task_db) + { + sqlite3_interrupt (task_db); + return 0; + } + else + { + return -1; + } +} _______________________________________________ Openvas-commits mailing list Openvas-commits@wald.intevation.org https://lists.wald.intevation.org/cgi-bin/mailman/listinfo/openvas-commits