Package: nagios2
Version: 2.6-2+etch1
Severity: important
Tags: patch
If I try to reload nagios (/etc/init.d/nagios reload), it frequently hangs
with FUTEX_WAIT in futex(). In this case, nagios can only be killed with
SIGKILL and some check-results might get lost.
This bug is fixed in upstream version 2.8, I attached the relevant patch.
You can find more detailled informations on the sourceforge mailarchive:
https://sourceforge.net/mailarchive/message.php?msg_id=45DDF356.7070300%40linuxhacker.at
-- System Information:
Debian Release: 4.0
APT prefers testing
APT policy: (500, 'testing')
Architecture: amd64 (x86_64)
Shell: /bin/sh linked to /bin/bash
Kernel: Linux 2.6.20
Locale: LANG=C, LC_CTYPE=de_DE (charmap=ISO-8859-1)
Versions of packages nagios2 depends on:
ii libc6 2.3.6.ds1-13 GNU C Library: Shared libraries
ii libgd2-noxpm 2.0.33-5.2 GD Graphics Library version 2 (wit
ii libjpeg62 6b-13 The Independent JPEG Group's JPEG
ii libperl5.8 5.8.8-7 Shared Perl library
ii libpng12-0 1.2.15~beta5-1 PNG library - runtime
ii nagios2-common 2.6-2+etch1 support files for nagios2
ii perl 5.8.8-7 Larry Wall's Practical Extraction
ii zlib1g 1:1.2.3-13 compression library - runtime
nagios2 recommends no packages.
-- no debconf information
diff -uNr nagios2-2.6.orig/base/nagios.c nagios2-2.6/base/nagios.c
--- nagios2-2.6.orig/base/nagios.c 2006-11-28 03:29:04.000000000 +0100
+++ nagios2-2.6/base/nagios.c 2007-03-27 17:44:42.000000000 +0200
@@ -142,6 +142,9 @@
int sigshutdown=FALSE;
int sigrestart=FALSE;
+static char *sigs[]={"EXIT","HUP","INT","QUIT","ILL","TRAP","ABRT","BUS","FPE","KILL","USR1","SEGV","USR2","PIPE","ALRM","TERM","STKFLT","CHLD","CONT","STOP","TSTP","TTIN","TTOU","URG","XCPU","XFSZ","VTALRM","PROF","WINCH","IO","PWR","UNUSED","ZERR","DEBUG",(char *)NULL};
+int caught_signal=FALSE;
+int sig_id=0;
int restarting=FALSE;
@@ -221,7 +224,7 @@
char buffer[MAX_INPUT_BUFFER];
int display_license=FALSE;
int display_help=FALSE;
- int c;
+ int c=0,x=0;
#ifdef HAVE_GETOPT_H
int option_index=0;
@@ -709,6 +712,29 @@
/* (doesn't return until a restart or shutdown signal is encountered) */
event_execution_loop();
+ /* 03/01/2007 EG Moved from sighandler() to prevent FUTEX locking problems under NPTL */
+ /* did we catch a signal? */
+ if(caught_signal==TRUE){
+
+ if(sig_id<0)
+ sig_id=-sig_id;
+
+ for(x=0;sigs[x]!=(char *)NULL;x++);
+ sig_id%=x;
+
+ if(sig_id==SIGHUP)
+ snprintf(buffer,sizeof(buffer),"Caught SIGHUP, restarting...\n");
+ else
+ snprintf(buffer,sizeof(buffer),"Caught SIG%s, shutting down...\n",sigs[sig_id]);
+ buffer[sizeof(buffer)-1]='\x0';
+
+#ifdef DEBUG2
+ printf("%s\n",buffer);
+#endif
+
+ write_to_all_logs(buffer,NSLOG_PROCESS_INFO);
+ }
+
#ifdef USE_EVENT_BROKER
/* send program data to broker */
broker_program_state(NEBTYPE_PROCESS_EVENTLOOPEND,NEBFLAG_NONE,NEBATTR_NONE,NULL);
diff -uNr nagios2-2.6.orig/base/utils.c nagios2-2.6/base/utils.c
--- nagios2-2.6.orig/base/utils.c 2006-10-28 00:58:20.000000000 +0200
+++ nagios2-2.6/base/utils.c 2007-03-27 17:44:45.000000000 +0200
@@ -76,6 +76,8 @@
extern int sigshutdown;
extern int sigrestart;
+extern int caught_signal;
+extern int sig_id;
extern int daemon_mode;
extern int daemon_dumps_core;
@@ -3373,56 +3375,27 @@
/* handle signals */
void sighandler(int sig){
- static char *sigs[]={"EXIT","HUP","INT","QUIT","ILL","TRAP","ABRT","BUS","FPE","KILL","USR1","SEGV","USR2","PIPE","ALRM","TERM","STKFLT","CHLD","CONT","STOP","TSTP","TTIN","TTOU","URG","XCPU","XFSZ","VTALRM","PROF","WINCH","IO","PWR","UNUSED","ZERR","DEBUG",(char *)NULL};
- int i;
- char temp_buffer[MAX_INPUT_BUFFER];
-
/* if shutdown is already true, we're in a signal trap loop! */
- if(sigshutdown==TRUE)
+ /* changed 09/07/06 to only exit on segfaults */
+ if(sigshutdown==TRUE && sig==SIGSEGV)
exit(ERROR);
+ caught_signal=TRUE;
+
if(sig<0)
sig=-sig;
- for(i=0;sigs[i]!=(char *)NULL;i++);
-
- sig%=i;
+ sig_id=sig;
/* we received a SIGHUP, so restart... */
- if(sig==SIGHUP){
-
+ if(sig==SIGHUP)
sigrestart=TRUE;
- sprintf(temp_buffer,"Caught SIGHUP, restarting...\n");
- write_to_all_logs(temp_buffer,NSLOG_PROCESS_INFO);
-#ifdef DEBUG2
- printf("%s\n",temp_buffer);
-#endif
- }
-
/* else begin shutting down... */
- else if(sig<16){
-
+ else if(sig<16)
sigshutdown=TRUE;
- sprintf(temp_buffer,"Caught SIG%s, shutting down...\n",sigs[sig]);
- write_to_all_logs(temp_buffer,NSLOG_PROCESS_INFO);
-
-#ifdef DEBUG2
- printf("%s\n",temp_buffer);
-#endif
-
-#ifdef REMOVED_06202006
- /* remove the lock file if we're in daemon mode */
- if(daemon_mode==TRUE)
- unlink(lock_file);
-
- /* close and delete the external command file FIFO */
- close_command_file();
-#endif
- }
-
return;
}