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