Roman Rakus 06616c
diff -up bash-4.1/sig.h.signal bash-4.1/sig.h
Roman Rakus 06616c
--- bash-4.1/sig.h.signal	2009-01-04 20:32:41.000000000 +0100
Roman Rakus 06616c
+++ bash-4.1/sig.h	2012-08-28 11:19:14.920224571 +0200
Roman Rakus 06616c
@@ -96,6 +96,8 @@ do { \
Roman Rakus 06616c
   sigprocmask (SIG_BLOCK, &nvar, &ovar); \
Roman Rakus 06616c
 } while (0)
Roman Rakus 06616c
 
Roman Rakus 06616c
+#define UNBLOCK_SIGNAL(ovar) sigprocmask (SIG_SETMASK, &ovar, (sigset_t *)NULL)
Roman Rakus 06616c
+
Roman Rakus 06616c
 #if defined (HAVE_POSIX_SIGNALS)
Roman Rakus 06616c
 #  define BLOCK_CHILD(nvar, ovar) \
Roman Rakus 06616c
 	BLOCK_SIGNAL (SIGCHLD, nvar, ovar)
Roman Rakus 06616c
diff -up bash-4.1/trap.c.signal bash-4.1/trap.c
Roman Rakus 06616c
--- bash-4.1/trap.c.signal	2009-10-10 23:21:44.000000000 +0200
Roman Rakus 06616c
+++ bash-4.1/trap.c	2012-08-28 10:58:14.746345797 +0200
Roman Rakus 06616c
@@ -516,6 +516,8 @@ set_signal (sig, string)
Roman Rakus 06616c
      int sig;
Roman Rakus 06616c
      char *string;
Roman Rakus 06616c
 {
Roman Rakus 06616c
+  sigset_t set, oset;
Roman Rakus 06616c
+
Roman Rakus 06616c
   if (SPECIAL_TRAP (sig))
Roman Rakus 06616c
     {
Roman Rakus 06616c
       change_signal (sig, savestring (string));
Roman Rakus 06616c
@@ -546,9 +548,10 @@ set_signal (sig, string)
Roman Rakus 06616c
      environment in which it is safe to do so. */
Roman Rakus 06616c
   if ((sigmodes[sig] & SIG_NO_TRAP) == 0)
Roman Rakus 06616c
     {
Roman Rakus 06616c
-      set_signal_handler (sig, SIG_IGN);
Roman Rakus 06616c
+      BLOCK_SIGNAL (sig, set, oset);
Roman Rakus 06616c
       change_signal (sig, savestring (string));
Roman Rakus 06616c
       set_signal_handler (sig, trap_handler);
Roman Rakus 06616c
+      UNBLOCK_SIGNAL (oset);
Roman Rakus 06616c
     }
Roman Rakus 06616c
   else
Roman Rakus 06616c
     change_signal (sig, savestring (string));