suggested fix for the sigchld race

Nicolas Williams Nicolas.Williams at ubsw.com
Thu Nov 1 05:33:38 EST 2001


Does this make it unnecessary to block SIGCHLD around where
child_terminated is manipulated? At first glance I'd say yes...

Your patch is rather elegant and simple.

The extra file descriptors needed should not be a problem, I don't
think. Why did you list that as a disadvantage?

Below is a patch to misc.h/misc.c/config.h.in to deal with signal
blocking. And sigprocmask and sigblock need to be added to the
configure.in list of function checks. And the code in serverloop2() that
manipulates child_terminated needs to be bracketed with calls to
block_sigchld()/unblock_sigchld(). I'm not recommending this patch, mind
you. I'll test yours...

Nico


On Wed, Oct 31, 2001 at 05:42:01PM +0100, Markus Friedl wrote:
> comments?
> 
> alternatives: sigsetjmp(ugly) and pselect(not portable, available)
> drawback: additional filedescriptors.
> 

Index: 2_9_p2_w_gss_krb5_named_keys.15/config.h.in
--- 2_9_p2_w_gss_krb5_named_keys.15/config.h.in Tue, 26 Jun 2001 16:27:13 -0400 (OpenSSH/f/45_config.h.i 1.3 644)
+++ 2_9_p2_w_gss_krb5_named_keys.16(w)/config.h.in Tue, 30 Oct 2001 15:55:15 -0500 (OpenSSH/f/45_config.h.i 1.4 644)
@@ -542,6 +542,12 @@
 /* Define if you have the sigvec function.  */
 #undef HAVE_SIGVEC
 
+/* Define if you have the sigprocmask function. */
+#undef HAVE_SIGPROCMASK
+
+/* Define if you have the sigblock function. */
+#undef HAVE_SIGBLOCK
+
 /* Define if you have the snprintf function.  */
 #undef HAVE_SNPRINTF
 
Index: 2_9_p2_w_gss_krb5_named_keys.15/misc.h
--- 2_9_p2_w_gss_krb5_named_keys.15/misc.h Thu, 03 May 2001 16:12:13 -0400 (OpenSSH/i/45_misc.h 1.1 644)
+++ 2_9_p2_w_gss_krb5_named_keys.16(w)/misc.h Tue, 30 Oct 2001 14:33:44 -0500 (OpenSSH/i/45_misc.h 1.2 644)
@@ -32,3 +32,6 @@
 /* wrapper for signal interface */
 typedef void (*mysig_t)(int);
 mysig_t mysignal(int sig, mysig_t act);
+
+void block_sigchld();
+void unblock_sigchld();
Index: 2_9_p2_w_gss_krb5_named_keys.15/misc.c
--- 2_9_p2_w_gss_krb5_named_keys.15/misc.c Fri, 22 Jun 2001 15:59:54 -0400 (OpenSSH/i/46_misc.c 1.2 644)
+++ 2_9_p2_w_gss_krb5_named_keys.16(w)/misc.c Tue, 30 Oct 2001 16:22:43 -0500 (OpenSSH/i/46_misc.c 1.3 644)
@@ -156,3 +156,34 @@
 	return (signal(sig, act));
 #endif
 }
+
+#ifdef HAVE_SIGPROCMASK
+static sigset_t osigset;
+#elif HAVE_SIGBLOCK
+static int osigmask;
+#endif
+
+void
+block_sigchld()
+{
+#ifdef HAVE_SIGPROCMASK
+        sigset_t sigchld_set;
+	(void) sigemptyset(&sigchld_set);
+	(void) sigaddset(&sigchld_set, SIGCHLD);
+	if (sigprocmask(SIG_BLOCK, &sigchld_set, &osigset) < 0)
+		debug("block_sigchld: sigprocmask() returned error %s", strerror(errno));
+#elif HAVE_SIGBLOCK
+	osigmask = sigblock(sigmask(SIGCHLD));
+#endif
+}
+
+void
+unblock_sigchld()
+{
+#ifdef HAVE_SIGPROCMASK
+	if (sigprocmask(SIG_UNBLOCK, &osigset, NULL) < 0)
+		debug("block_sigchld: sigprocmask() returned error %s", strerror(errno));
+#elif HAVE_SIGBLOCK
+	(void) sigsetmask(osigmask);
+#endif
+}

Visit our website at http://www.ubswarburg.com

This message contains confidential information and is intended only 
for the individual named.  If you are not the named addressee you 
should not disseminate, distribute or copy this e-mail.  Please 
notify the sender immediately by e-mail if you have received this 
e-mail by mistake and delete this e-mail from your system.

E-mail transmission cannot be guaranteed to be secure or error-free 
as information could be intercepted, corrupted, lost, destroyed, 
arrive late or incomplete, or contain viruses.  The sender therefore 
does not accept liability for any errors or omissions in the contents 
of this message which arise as a result of e-mail transmission.  If 
verification is required please request a hard-copy version.  This 
message is provided for informational purposes and should not be 
construed as a solicitation or offer to buy or sell any securities or 
related financial instruments.




More information about the openssh-unix-dev mailing list