From d6c4c6eaa86c3031c03457f48e74bcdc68aa9451 Mon Sep 17 00:00:00 2001 From: nook24 Date: Thu, 23 Mar 2023 21:00:16 +0000 Subject: [PATCH] Do not crash if wps is NULL. This could happen if a core worker dies and gets respawned Signed-off-by: nook24 --- src/naemon/checks_host.c | 52 +++++++++++++++++++++------------------- src/naemon/workers.c | 7 +++++- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/src/naemon/checks_host.c b/src/naemon/checks_host.c index e7f48620..91924f5b 100644 --- a/src/naemon/checks_host.c +++ b/src/naemon/checks_host.c @@ -636,33 +636,35 @@ static void handle_worker_host_check(wproc_result *wpres, void *arg, int flags) if (currently_running_host_checks > 0) currently_running_host_checks--; - hst = find_host(cr->host_name); - if (hst && wpres) { - hst->is_executing = FALSE; - memcpy(&cr->rusage, &wpres->rusage, sizeof(wpres->rusage)); - cr->start_time.tv_sec = wpres->start.tv_sec; - cr->start_time.tv_usec = wpres->start.tv_usec; - cr->finish_time.tv_sec = wpres->stop.tv_sec; - cr->finish_time.tv_usec = wpres->stop.tv_usec; - if (WIFEXITED(wpres->wait_status)) { - cr->return_code = WEXITSTATUS(wpres->wait_status); - } else { - cr->return_code = STATE_UNKNOWN; - } + if (wpres) { + hst = find_host(cr->host_name); + if (hst) { + hst->is_executing = FALSE; + memcpy(&cr->rusage, &wpres->rusage, sizeof(wpres->rusage)); + cr->start_time.tv_sec = wpres->start.tv_sec; + cr->start_time.tv_usec = wpres->start.tv_usec; + cr->finish_time.tv_sec = wpres->stop.tv_sec; + cr->finish_time.tv_usec = wpres->stop.tv_usec; + if (WIFEXITED(wpres->wait_status)) { + cr->return_code = WEXITSTATUS(wpres->wait_status); + } else { + cr->return_code = STATE_UNKNOWN; + } - if (wpres->outstd && *wpres->outstd) { - cr->output = nm_strdup(wpres->outstd); - } else if (wpres->outerr && *wpres->outerr) { - nm_asprintf(&cr->output, "(No output on stdout) stderr: %s", wpres->outerr); - } else { - cr->output = NULL; - } + if (wpres->outstd && *wpres->outstd) { + cr->output = nm_strdup(wpres->outstd); + } else if (wpres->outerr && *wpres->outerr) { + nm_asprintf(&cr->output, "(No output on stdout) stderr: %s", wpres->outerr); + } else { + cr->output = NULL; + } - cr->early_timeout = wpres->early_timeout; - cr->exited_ok = wpres->exited_ok; - cr->engine = NULL; - cr->source = wpres->source; - process_check_result(cr); + cr->early_timeout = wpres->early_timeout; + cr->exited_ok = wpres->exited_ok; + cr->engine = NULL; + cr->source = wpres->source; + process_check_result(cr); + } } free_check_result(cr); nm_free(cr); diff --git a/src/naemon/workers.c b/src/naemon/workers.c index 588148b8..53be1edd 100644 --- a/src/naemon/workers.c +++ b/src/naemon/workers.c @@ -163,6 +163,11 @@ static void run_job_callback(struct wproc_job *job, struct wproc_result *wpres, { if (!job || !job->callback) return; + + if (!wpres) { + nm_log(NSLOG_RUNTIME_ERROR, "---!!!--- wpres is null or so TODO REMOVE THIS"); + return; + } (*job->callback)(wpres, job->data, val); job->callback = NULL; @@ -446,7 +451,7 @@ static int handle_worker_result(int sd, int events, void *arg) nm_log(NSLOG_RUNTIME_ERROR, "wproc: We have have less Core Workers than we should have, trying to respawn Core Worker"); /* Respawn a worker */ - if ((ret = spawn_core_worker()) < 0) { + if ((ret = spawn_core_worker()) < 0) { nm_log(NSLOG_RUNTIME_ERROR, "wproc: Failed to respawn Core Worker"); } else { nm_log(NSLOG_INFO_MESSAGE, "wproc: Respawning Core Worker %u was successful", ret);