diff --git a/CHANGELOG.md b/CHANGELOG.md index 36543fdef1..aaaa7a2caa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -123,6 +123,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Fix and simplify parse_iso_time and add tests [#1129](https://github.com/greenbone/gvmd/pull/1129) - Fix gvm-manage-certs. [#1140](https://github.com/greenbone/gvmd/pull/1140) - Fix CVE scanner and results handling [#1141](https://github.com/greenbone/gvmd/pull/1141) +- Handle INTERRUPTED scans [#1146](https://github.com/greenbone/gvmd/pull/1146) ### Removed - Remove support for "All SecInfo": removal of "allinfo" for type in get_info [#790](https://github.com/greenbone/gvmd/pull/790) diff --git a/src/manage.c b/src/manage.c index 48f2d78531..3c2a227bdc 100644 --- a/src/manage.c +++ b/src/manage.c @@ -600,7 +600,7 @@ truncate_text (gchar *string, size_t max_len, gboolean xml, const char *suffix) // move the offset to the start of that entity. ssize_t entity_start_offset = offset; - while (entity_start_offset >= 0 + while (entity_start_offset >= 0 && string[entity_start_offset] != '&') { entity_start_offset --; @@ -3466,7 +3466,8 @@ delete_osp_scan (const char *report_id, const char *host, int port, * @param[in] pop_results 1 to pop results, 0 to leave results intact. * @param[out] report_xml Scan report. * - * @return -1 on error, progress value between 0 and 100 on success. + * @return -1 on error, -2 if the scan was interrupted, progress value + * between 0 and 100 on success. */ static int get_osp_scan_report (const char *scan_id, const char *host, int port, @@ -3545,7 +3546,8 @@ get_osp_scan_status (const char *scan_id, const char *host, int port, * @param[in] report The report. * @param[in] scan_id The UUID of the scan on the scanner. * - * @return 0 if success, -1 if error, -2 if scan was stopped. + * @return 0 if success, -1 if error, -2 if scan was stopped, + * -3 if the scan was interrupted. */ static int handle_osp_scan (task_t task, report_t report, const char *scan_id) @@ -3580,7 +3582,7 @@ handle_osp_scan (task_t task, report_t report, const char *scan_id) progress = get_osp_scan_report (scan_id, host, port, ca_pub, key_pub, key_priv, 0, 0, &report_xml); - if (progress < 0 || progress > 100) + if ((progress < 0 || progress > 100) && progress != -2) { result_t result = make_osp_result (task, "", "", "", @@ -3598,7 +3600,7 @@ handle_osp_scan (task_t task, report_t report, const char *scan_id) /* Get the full OSP report. */ progress = get_osp_scan_report (scan_id, host, port, ca_pub, key_pub, key_priv, 1, 1, &report_xml); - if (progress < 0 || progress > 100) + if ((progress < 0 || progress > 100) && progress != -2) { result_t result = make_osp_result (task, "", "", "", @@ -3628,6 +3630,19 @@ handle_osp_scan (task_t task, report_t report, const char *scan_id) queued_status_updated = TRUE; } } + else if (osp_scan_status == OSP_SCAN_STATUS_INTERRUPTED) + { + result_t result = make_osp_result + (task, "", "", "", + threat_message_type ("Error"), + "Task interrupted unexpectedly", "", "", + QOD_DEFAULT); + report_add_result (report, result); + delete_osp_scan (scan_id, host, port, ca_pub, key_pub, + key_priv); + rc = -3; + break; + } else if (progress >= 0 && progress < 100 && osp_scan_status == OSP_SCAN_STATUS_STOPPED) { @@ -4560,6 +4575,11 @@ fork_osp_scan_handler (task_t task, target_t target, int from, set_task_run_status (task, TASK_STATUS_STOPPED); set_report_scan_run_status (global_current_report, TASK_STATUS_STOPPED); } + else if (rc == -3) + { + set_task_run_status (task, TASK_STATUS_INTERRUPTED); + set_report_scan_run_status (global_current_report, TASK_STATUS_INTERRUPTED); + } set_task_end_time_epoch (task, time (NULL)); set_scan_end_time_epoch (global_current_report, time (NULL));