From 9bda8b3c7d3c874c94ff2bd990869b3a7eeda668 Mon Sep 17 00:00:00 2001 From: Matt Mundell Date: Thu, 22 Oct 2026 11:50:55 +0000 Subject: [PATCH 1/3] Add: openvasd get_performance body overwrite tests --- openvasd/openvasd_tests.c | 95 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/openvasd/openvasd_tests.c b/openvasd/openvasd_tests.c index 51aced51..7f84ffc3 100644 --- a/openvasd/openvasd_tests.c +++ b/openvasd/openvasd_tests.c @@ -32,15 +32,106 @@ json_array_contains_string (cJSON *array, const char *value) return FALSE; } +static glong mock_http_status = 200; + +gvm_http_response_t * +gvm_http_request_unix (const gchar *url, gvm_http_method_t method, + const gchar *payload, gvm_http_headers_t *headers, + const gchar *ca_cert, const gchar *client_cert, + const gchar *client_key, const gchar *unix_socket_path, + gvm_http_response_stream_t response) +{ + static const gchar body[] = "[{\"cpu\": 12.5}]"; + gvm_http_response_t *http_response; + + (void) url; + (void) method; + (void) payload; + (void) headers; + (void) ca_cert; + (void) client_cert; + (void) client_key; + (void) unix_socket_path; + + http_response = g_malloc0 (sizeof (gvm_http_response_t)); + http_response->http_status = mock_http_status; + + if (mock_http_status == -1) + return http_response; + + http_response->data = g_strdup (body); + http_response->size = strlen (http_response->data); + + if (response) + { + g_free (response->data); + response->data = g_strdup (body); + response->length = strlen (response->data); + } + + return http_response; +} + +static http_scanner_connector_t +mock_performance_connector (void) +{ + http_scanner_connector_t conn = http_scanner_connector_new (); + int port = 9390; + + http_scanner_connector_builder (conn, HTTP_SCANNER_PROTOCOL, "http"); + http_scanner_connector_builder (conn, HTTP_SCANNER_HOST, "localhost"); + http_scanner_connector_builder (conn, HTTP_SCANNER_PORT, &port); + + return conn; +} + Describe (openvasd); BeforeEach (openvasd) { + mock_http_status = 200; } AfterEach (openvasd) { } +Ensure (openvasd, openvasd_get_performance_frees_body_on_success) +{ + http_scanner_connector_t conn = mock_performance_connector (); + openvasd_get_performance_opts_t opts = { + .start = 1, .end = 2, .titles = "cpu"}; + http_scanner_resp_t resp; + + resp = openvasd_get_performance (conn, opts); + + assert_that (resp->code, is_equal_to (200)); + assert_that (resp->body, is_equal_to_string ("[{\"cpu\": 12.5}]")); + + http_scanner_response_cleanup (resp); + http_scanner_connector_free (conn); +} + +Ensure (openvasd, openvasd_get_performance_frees_body_on_error) +{ + http_scanner_connector_t conn = mock_performance_connector (); + openvasd_get_performance_opts_t opts = { + .start = 1, .end = 2, .titles = "cpu"}; + http_scanner_resp_t resp; + + mock_http_status = -1; + + resp = openvasd_get_performance (conn, opts); + + assert_that (resp->code, is_equal_to (-1)); + assert_that ( + resp->body, + is_equal_to_string ( + "{\"error\": \"Not possible to get performance information.\"}")); + + http_scanner_response_cleanup (resp); + http_scanner_connector_free (conn); +} + Ensure (openvasd, openvasd_add_credential_to_scan_json) { scan_credential_t *credential; @@ -608,6 +699,10 @@ main (int argc, char **argv) openvasd_build_scan_config_json_with_finished_hosts); add_test_with_context ( suite, openvasd, openvasd_build_scan_config_json_without_finished_hosts); + add_test_with_context (suite, openvasd, + openvasd_get_performance_frees_body_on_success); + add_test_with_context (suite, openvasd, + openvasd_get_performance_frees_body_on_error); if (argc > 1) ret = run_single_test (suite, argv[1], create_text_reporter ()); else From f3ca578c8dc3d19709e9cd975a1104ea8451136c Mon Sep 17 00:00:00 2001 From: Matt Mundell Date: Thu, 22 Oct 2026 11:52:37 +0000 Subject: [PATCH 2/3] Fix: free performance body before overwriting on success The body from http_scanner_send_request() leaked on every success. --- openvasd/openvasd.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openvasd/openvasd.c b/openvasd/openvasd.c index a0274b5b..71b0f97b 100644 --- a/openvasd/openvasd.c +++ b/openvasd/openvasd.c @@ -158,7 +158,10 @@ openvasd_get_performance (http_scanner_connector_t conn, g_free (query); if (response->code != RESP_CODE_ERR) - response->body = g_strdup (http_scanner_stream_str (conn)); + { + g_free (response->body); + response->body = g_strdup (http_scanner_stream_str (conn)); + } else { response->body = g_strdup ( From 8580ebeb171a00f18fcebe1dec8c99e99d242777 Mon Sep 17 00:00:00 2001 From: Matt Mundell Date: Thu, 22 Oct 2026 11:52:53 +0000 Subject: [PATCH 3/3] Fix: free performance body before overwriting on error The body from http_scanner_send_request() leaked on every error. --- openvasd/openvasd.c | 1 + 1 file changed, 1 insertion(+) diff --git a/openvasd/openvasd.c b/openvasd/openvasd.c index 71b0f97b..20a3698d 100644 --- a/openvasd/openvasd.c +++ b/openvasd/openvasd.c @@ -164,6 +164,7 @@ openvasd_get_performance (http_scanner_connector_t conn, } else { + g_free (response->body); response->body = g_strdup ( "{\"error\": \"Not possible to get performance information.\"}"); g_warning ("%s: Not possible to get performance information", __func__);