From d83eb0c7d0c4c58ade045e1ee44a6f5ade83e964 Mon Sep 17 00:00:00 2001
From: Christopher Faylor <me@cgf.cx>
Date: Wed, 2 Mar 2005 15:32:34 +0000
Subject: [PATCH] * spawn.cc (do_cleanup): Properly restore SIGINT/SIGQUIT even
 if they had previously been SIG_DFL.

---
 winsup/cygwin/ChangeLog |  5 +++++
 winsup/cygwin/spawn.cc  | 12 ++++++------
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index e62d17d4e..2b2f1caea 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,8 @@
+2005-03-02  Christopher Faylor  <cgf@timesys.com>
+
+	* spawn.cc (do_cleanup): Properly restore SIGINT/SIGQUIT even if they
+	had previously been SIG_DFL.
+
 2005-03-01  Corinna Vinschen  <corinna@vinschen.de>
 
 	* fhandler_disk_file.cc (fhandler_disk_file::touch_ctime): Replace
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc
index cfd89a840..38a2a1e9a 100644
--- a/winsup/cygwin/spawn.cc
+++ b/winsup/cygwin/spawn.cc
@@ -332,12 +332,12 @@ static void
 do_cleanup (void *args)
 {
 # define cleanup ((pthread_cleanup *) args)
-  if (cleanup->oldint)
-    signal (SIGINT, cleanup->oldint);
-  if (cleanup->oldquit)
-    signal (SIGQUIT, cleanup->oldquit);
   if (cleanup->oldmask != (sigset_t) -1)
-    sigprocmask (SIG_SETMASK, &(cleanup->oldmask), NULL);
+    {
+      signal (SIGINT, cleanup->oldint);
+      signal (SIGQUIT, cleanup->oldquit);
+      sigprocmask (SIG_SETMASK, &(cleanup->oldmask), NULL);
+    }
 # undef cleanup
 }
 
@@ -755,7 +755,6 @@ spawn_guts (const char * prog_arg, const char *const *argv,
 
   int res;
   pthread_cleanup cleanup;
-  pthread_cleanup_push (do_cleanup, (void *) &cleanup);
   if (mode == _P_SYSTEM)
     {
       sigset_t child_block;
@@ -765,6 +764,7 @@ spawn_guts (const char * prog_arg, const char *const *argv,
       sigaddset (&child_block, SIGCHLD);
       (void) sigprocmask (SIG_BLOCK, &child_block, &cleanup.oldmask);
     }
+  pthread_cleanup_push (do_cleanup, (void *) &cleanup);
 
   /* Fixup the parent data structures if needed and resume the child's
      main thread. */