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

Reply via email to