bash/bash-4.2-trap.patch
Roman Rakus 185aa1593d fix deadlock in trap, backported from devel branch
Signed-off-by: Roman Rakus <rrakus@redhat.com>
2013-06-27 10:03:57 +02:00

61 lines
1.5 KiB
Diff

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