[git commit master] ash: do not let EXIT trap to fire in `trap`

Denys Vlasenko vda.linux at googlemail.com
Thu Sep 24 01:09:26 UTC 2009


commit: http://git.busybox.net/busybox/commit/?id=0800e3af75461c6322427dab53d3526066453b04
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 shell/ash.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/shell/ash.c b/shell/ash.c
index 597bc28..47f968b 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -4525,7 +4525,7 @@ clear_traps(void)
 			INT_OFF;
 			free(*tp);
 			*tp = NULL;
-			if (tp != &trap[0])
+			if ((tp - trap) != 0)
 				setsignal(tp - trap);
 			INT_ON;
 		}
@@ -4596,6 +4596,8 @@ forkchild(struct job *jp, union node *n, int mode)
 		 *
 		 * Our solution: ONLY bare $(trap) or `trap` is special.
 		 */
+		free(trap[0]); /* Prevent EXIT trap from firing in `trap` */
+		trap[0] = NULL;
 	} else {
 		clear_traps();
 	}
@@ -13023,6 +13025,7 @@ exitshell(void)
 	if (p) {
 		trap[0] = NULL;
 		evalstring(p, 0);
+		free(p);
 	}
 	flush_stdout_stderr();
  out:
-- 
1.6.3.3



More information about the busybox-cvs mailing list