psss / rpms / bash

Forked from rpms/bash 6 years ago
Clone
Roman Rakus 185aa15
commit 41d203e21f94c1b8bfc457606ee633c22da3cf04
Roman Rakus 185aa15
Author: Chet Ramey <chet.ramey@case.edu>
Roman Rakus 185aa15
Date:   Wed Jun 12 09:29:51 2013 -0400
Roman Rakus 185aa15
Roman Rakus 185aa15
    commit bash-20130523 snapshot
Roman Rakus 185aa15
Roman Rakus 185aa15
diff --git a/trap.c b/trap.c
Roman Rakus 185aa15
index 1e11d1f..da59b26 100644
Roman Rakus 185aa15
--- a/trap.c
Roman Rakus 185aa15
+++ b/trap.c
Roman Rakus 185aa15
@@ -286,6 +286,9 @@ run_pending_traps ()
Roman Rakus 185aa15
   if (catch_flag == 0)		/* simple optimization */
Roman Rakus 185aa15
     return;
Roman Rakus 185aa15
 
Roman Rakus 185aa15
+  if (running_trap > 0)
Roman Rakus 185aa15
+    return;			/* no recursive trap invocations */
Roman Rakus 185aa15
+
Roman Rakus 185aa15
   catch_flag = trapped_signal_received = 0;
Roman Rakus 185aa15
 
Roman Rakus 185aa15
   /* Preserve $? when running trap. */
Roman Rakus 185aa15
@@ -304,6 +307,8 @@ run_pending_traps ()
Roman Rakus 185aa15
 
Roman Rakus 185aa15
 	  BLOCK_SIGNAL (sig, set, oset);
Roman Rakus 185aa15
 
Roman Rakus 185aa15
+	  running_trap = sig + 1;
Roman Rakus 185aa15
+
Roman Rakus 185aa15
 	  if (sig == SIGINT)
Roman Rakus 185aa15
 	    {
Roman Rakus 185aa15
 	      run_interrupt_trap ();
Roman Rakus 185aa15
@@ -324,6 +329,7 @@ run_pending_traps ()
Roman Rakus 185aa15
 	    {
Roman Rakus 185aa15
 	      /* This can happen when run_pending_traps is called while
Roman Rakus 185aa15
 		 running a SIGCHLD trap handler. */
Roman Rakus 185aa15
+	      running_trap = 0;
Roman Rakus 185aa15
 	      UNBLOCK_SIGNAL (oset);
Roman Rakus 185aa15
 	      continue;					/* XXX */
Roman Rakus 185aa15
 	    }
Roman Rakus 185aa15
@@ -359,7 +365,14 @@ run_pending_traps ()
Roman Rakus 185aa15
 	      save_subst_varlist = subst_assign_varlist;
Roman Rakus 185aa15
 	      subst_assign_varlist = 0;
Roman Rakus 185aa15
 
Roman Rakus 185aa15
+#if defined (JOB_CONTROL)
Roman Rakus 185aa15
+	      save_pipeline (1);	/* XXX only provides one save level */
Roman Rakus 185aa15
+#endif
Roman Rakus 185aa15
 	      evalstring (savestring (trap_list[sig]), "trap", SEVAL_NONINT|SEVAL_NOHIST|SEVAL_RESETLINE);
Roman Rakus 185aa15
+#if defined (JOB_CONTROL)
Roman Rakus 185aa15
+	      restore_pipeline (1);
Roman Rakus 185aa15
+#endif
Roman Rakus 185aa15
+
Roman Rakus 185aa15
 	      restore_token_state (token_state);
Roman Rakus 185aa15
 	      free (token_state);
Roman Rakus 185aa15
 
Roman Rakus 185aa15
@@ -367,6 +380,7 @@ run_pending_traps ()
Roman Rakus 185aa15
 	    }
Roman Rakus 185aa15
 
Roman Rakus 185aa15
 	  pending_traps[sig] = 0;
Roman Rakus 185aa15
+	  running_trap = 0;
Roman Rakus 185aa15
 
Roman Rakus 185aa15
 	  UNBLOCK_SIGNAL (oset);
Roman Rakus 185aa15
 	}