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; }