diff options
author | Michael Orlitzky <mjo@gentoo.org> | 2019-08-19 19:30:32 -0400 |
---|---|---|
committer | Michael Orlitzky <mjo@gentoo.org> | 2019-08-19 19:30:56 -0400 |
commit | c4f4d3abf675460b53e5ebb9a0550a4c9a539771 (patch) | |
tree | c5fb78b175ac3b35840e2863bb8a11cc46674f98 /net-analyzer/nagios-core | |
parent | media-video/ffmpeg: add missing space (diff) | |
download | gentoo-c4f4d3abf675460b53e5ebb9a0550a4c9a539771.tar.gz gentoo-c4f4d3abf675460b53e5ebb9a0550a4c9a539771.tar.bz2 gentoo-c4f4d3abf675460b53e5ebb9a0550a4c9a539771.zip |
net-analyzer/nagios-core: new revision fixing zombie process bug.
Bug: https://bugs.gentoo.org/692092
Reported-by: Tomáš Mózes <hydrapolic@gmail.com>
Package-Manager: Portage-2.3.69, Repoman-2.3.16
Signed-off-by: Michael Orlitzky <mjo@gentoo.org>
Diffstat (limited to 'net-analyzer/nagios-core')
-rw-r--r-- | net-analyzer/nagios-core/files/nagios-core-4.4.4-no-zombie-processes.patch | 158 | ||||
-rw-r--r-- | net-analyzer/nagios-core/nagios-core-4.4.4-r1.ebuild (renamed from net-analyzer/nagios-core/nagios-core-4.4.4.ebuild) | 2 |
2 files changed, 160 insertions, 0 deletions
diff --git a/net-analyzer/nagios-core/files/nagios-core-4.4.4-no-zombie-processes.patch b/net-analyzer/nagios-core/files/nagios-core-4.4.4-no-zombie-processes.patch new file mode 100644 index 000000000000..4592b1d27f44 --- /dev/null +++ b/net-analyzer/nagios-core/files/nagios-core-4.4.4-no-zombie-processes.patch @@ -0,0 +1,158 @@ +This was an upstream bug that has been reverted for nagios-core-4.4.5: + + https://github.com/NagiosEnterprises/nagioscore/issues/683 + +Thanks to Tomáš Mózes (hydrapolic) for noticing and reporting the fix. + +diff --git a/base/events.c b/base/events.c +index d601e970f..bb27b3240 100644 +--- a/base/events.c ++++ b/base/events.c +@@ -351,13 +351,12 @@ void init_timing_loop(void) { + */ + check_delay = + mult_factor * scheduling_info.service_inter_check_delay; +- time_t check_window = reschedule_within_timeperiod(next_valid_time, temp_service->check_period_ptr, check_window(temp_service)) - current_time; +- if(check_delay > check_window) { ++ if(check_delay > check_window(temp_service)) { + log_debug_info(DEBUGL_EVENTS, 0, + " Fixing check time %lu secs too far away\n", +- check_delay - check_window); ++ check_delay - check_window(temp_service)); + fixed_services++; +- check_delay = check_window; ++ check_delay = check_window(temp_service); + log_debug_info(DEBUGL_EVENTS, 0, " New check offset: %d\n", + check_delay); + } +@@ -370,7 +369,8 @@ void init_timing_loop(void) { + if(is_valid_time == ERROR) { + log_debug_info(DEBUGL_EVENTS, 2, "Preferred Time is Invalid In Timeperiod '%s': %lu --> %s\n", temp_service->check_period_ptr->name, (unsigned long)temp_service->next_check, ctime(&temp_service->next_check)); + get_next_valid_time(temp_service->next_check, &next_valid_time, temp_service->check_period_ptr); +- temp_service->next_check = reschedule_within_timeperiod(next_valid_time, temp_service->check_period_ptr, check_window(temp_service)); ++ temp_service->next_check = ++ (time_t)(next_valid_time + check_delay); + } + + log_debug_info(DEBUGL_EVENTS, 2, "Actual Check Time: %lu --> %s\n", (unsigned long)temp_service->next_check, ctime(&temp_service->next_check)); +@@ -508,7 +508,7 @@ void init_timing_loop(void) { + log_debug_info(DEBUGL_EVENTS, 1, "Fixing check time (off by %lu)\n", + check_delay - check_window(temp_host)); + fixed_hosts++; +- check_delay = reschedule_within_timeperiod(next_valid_time, temp_host->check_period_ptr, check_window(temp_host)); ++ check_delay = ranged_urand(0, check_window(temp_host)); + } + temp_host->next_check = (time_t)(current_time + check_delay); + +diff --git a/cgi/status.c b/cgi/status.c +index ae723c683..2f6a60fde 100644 +--- a/cgi/status.c ++++ b/cgi/status.c +@@ -221,8 +221,26 @@ int main(void) { + document_header(TRUE); + + /* if a navbar search was performed, find the host by name, address or partial name */ +- if(navbar_search == TRUE) { +- if(host_name != NULL && NULL != strstr(host_name, "*")) { ++ if(navbar_search == TRUE && host_name != NULL) { ++ ++ /* Remove trailing spaces from host_name */ ++ len = strlen(host_name); ++ for (i = len - 1; i >= 0; i--) { ++ if (!isspace(host_name[i])) { ++ host_name[i+1] = '\0'; ++ break; ++ } ++ } ++ ++ /* Remove leading spaces from host_name */ ++ for (i = 0; i < len; i++) { ++ if (!isspace(host_name[i])) { ++ break; ++ } ++ } ++ strcpy(host_name, host_name + i); ++ ++ if(NULL != strstr(host_name, "*")) { + /* allocate for 3 extra chars, ^, $ and \0 */ + host_filter = malloc(sizeof(char) * (strlen(host_name) * 2 + 3)); + len = strlen(host_name); +@@ -238,7 +256,7 @@ int main(void) { + host_filter[regex_i++] = '$'; + host_filter[regex_i] = '\0'; + } +- else if (host_name != NULL) { ++ else { + if((temp_host = find_host(host_name)) == NULL) { + for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { + if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) +diff --git a/lib/worker.c b/lib/worker.c +index 4f7cbc384..a94719cc4 100644 +--- a/lib/worker.c ++++ b/lib/worker.c +@@ -215,7 +215,7 @@ int worker_buf2kvvec_prealloc(struct kvvec *kvv, char *buf, unsigned long len, i + } while (0) + + /* forward declaration */ +-static int gather_output(child_process *cp, iobuf *io, int final); ++static void gather_output(child_process *cp, iobuf *io, int final); + + static void destroy_job(child_process *cp) + { +@@ -258,23 +258,15 @@ static void destroy_job(child_process *cp) + int finish_job(child_process *cp, int reason) + { + static struct kvvec resp = KVVEC_INITIALIZER; +- int i, ret, rd; ++ int i, ret; + + /* get rid of still open filedescriptors */ + if (cp->outstd.fd != -1) { +- +- rd = 1; +- while(rd > 0) { +- rd = gather_output(cp, &cp->outstd, 0); +- } ++ gather_output(cp, &cp->outstd, 1); + iobroker_close(iobs, cp->outstd.fd); + } + if (cp->outerr.fd != -1) { +- +- rd = 1; +- while(rd > 0) { +- rd = gather_output(cp, &cp->outerr, 0); +- } ++ gather_output(cp, &cp->outerr, 1); + iobroker_close(iobs, cp->outerr.fd); + } + +@@ -450,13 +442,13 @@ static void kill_job(child_process *cp, int reason) + destroy_job(cp); + } + +-static int gather_output(child_process *cp, iobuf *io, int final) ++static void gather_output(child_process *cp, iobuf *io, int final) + { + int retry = 5; +- int rd; + + for (;;) { + char buf[4096]; ++ int rd; + + rd = read(io->fd, buf, sizeof(buf)); + if (rd < 0) { +@@ -492,13 +484,13 @@ static int gather_output(child_process *cp, iobuf *io, int final) + if (rd <= 0 || final) { + iobroker_close(iobs, io->fd); + io->fd = -1; ++ if (!final) ++ check_completion(cp, WNOHANG); + break; + } + + break; + } +- +- return rd; + } diff --git a/net-analyzer/nagios-core/nagios-core-4.4.4.ebuild b/net-analyzer/nagios-core/nagios-core-4.4.4-r1.ebuild index 74ddb853c43e..520b2503a8c5 100644 --- a/net-analyzer/nagios-core/nagios-core-4.4.4.ebuild +++ b/net-analyzer/nagios-core/nagios-core-4.4.4-r1.ebuild @@ -70,6 +70,8 @@ RDEPEND="${DEPEND} S="${WORKDIR}/${MY_P}" +PATCHES=( "${FILESDIR}/${P}-no-zombie-processes.patch" ) + pkg_setup() { enewgroup nagios enewuser nagios -1 /bin/bash /var/nagios/home nagios |