svn commit: trunk/busybox/shell: ash_test/ash-signals
vda at busybox.net
vda at busybox.net
Sat Jul 26 13:45:58 UTC 2008
Author: vda
Date: 2008-07-26 06:45:57 -0700 (Sat, 26 Jul 2008)
New Revision: 22948
Log:
ash: hopefully close bug 4324. With testcase.
function old new delta
evaltree 621 869 +248
popstring 134 140 +6
Added:
trunk/busybox/shell/ash_test/ash-signals/signal2.right
trunk/busybox/shell/ash_test/ash-signals/signal2.tests
Modified:
trunk/busybox/shell/ash.c
Changeset:
Modified: trunk/busybox/shell/ash.c
===================================================================
--- trunk/busybox/shell/ash.c 2008-07-25 13:40:06 UTC (rev 22947)
+++ trunk/busybox/shell/ash.c 2008-07-26 13:45:57 UTC (rev 22948)
@@ -203,7 +203,7 @@
#define S_RESET 5 /* temporary - to reset a hard ignored sig */
/* indicates specified signal received */
- char gotsig[NSIG - 1];
+ char gotsig[NSIG - 1]; /* offset by 1: "signal" 0 is meaningless */
char *trap[NSIG];
/* Rarely referenced stuff */
@@ -7846,12 +7846,12 @@
pendingsig = 0;
xbarrier();
- for (i = 0, q = gotsig; i < NSIG - 1; i++, q++) {
+ for (i = 1, q = gotsig; i < NSIG; i++, q++) {
if (!*q)
continue;
*q = '\0';
- p = trap[i + 1];
+ p = trap[i];
if (!p)
continue;
skip = evalstring(p, SKIPEVAL);
@@ -7881,16 +7881,33 @@
static void
evaltree(union node *n, int flags)
{
+
+ struct jmploc *volatile savehandler = exception_handler;
+ struct jmploc jmploc;
int checkexit = 0;
void (*evalfn)(union node *, int);
- unsigned isor;
int status;
+
if (n == NULL) {
TRACE(("evaltree(NULL) called\n"));
- goto out;
+ goto out1;
}
TRACE(("pid %d, evaltree(%p: %d, %d) called\n",
getpid(), n, n->type, flags));
+
+ exception_handler = &jmploc;
+ {
+ int err = setjmp(jmploc.loc);
+ if (err) {
+ /* if it was a signal, check for trap handlers */
+ if (exception == EXSIG)
+ goto out;
+ /* continue on the way out */
+ exception_handler = savehandler;
+ longjmp(exception_handler->loc, err);
+ }
+ }
+
switch (n->type) {
default:
#if DEBUG
@@ -7936,19 +7953,20 @@
goto calleval;
case NAND:
case NOR:
- case NSEMI:
+ case NSEMI: {
+
#if NAND + 1 != NOR
#error NAND + 1 != NOR
#endif
#if NOR + 1 != NSEMI
#error NOR + 1 != NSEMI
#endif
- isor = n->type - NAND;
+ unsigned is_or = is_or = n->type - NAND;
evaltree(
n->nbinary.ch1,
- (flags | ((isor >> 1) - 1)) & EV_TESTED
+ (flags | ((is_or >> 1) - 1)) & EV_TESTED
);
- if (!exitstatus == isor)
+ if (!exitstatus == is_or)
break;
if (!evalskip) {
n = n->nbinary.ch2;
@@ -7959,6 +7977,7 @@
break;
}
break;
+ }
case NIF:
evaltree(n->nif.test, EV_TESTED);
if (evalskip)
@@ -7979,8 +7998,11 @@
exitstatus = status;
break;
}
+
out:
- if ((checkexit & exitstatus))
+ exception_handler = savehandler;
+ out1:
+ if (checkexit & exitstatus)
evalskip |= SKIPEVAL;
else if (pendingsig && dotrap())
goto exexit;
@@ -11907,18 +11929,15 @@
if (!*ap) {
for (signo = 0; signo < NSIG; signo++) {
if (trap[signo] != NULL) {
- const char *sn;
-
- sn = get_signame(signo);
out1fmt("trap -- %s %s\n",
- single_quote(trap[signo]), sn);
+ single_quote(trap[signo]),
+ get_signame(signo));
}
}
return 0;
}
- if (!ap[1])
- action = NULL;
- else
+ action = NULL;
+ if (ap[1])
action = *ap++;
while (*ap) {
signo = get_signum(*ap);
Added: trunk/busybox/shell/ash_test/ash-signals/signal2.right
===================================================================
--- trunk/busybox/shell/ash_test/ash-signals/signal2.right (rev 0)
+++ trunk/busybox/shell/ash_test/ash-signals/signal2.right 2008-07-26 13:45:57 UTC (rev 22948)
@@ -0,0 +1,3 @@
+sleeping
+child exits as expected
+parent exits
Added: trunk/busybox/shell/ash_test/ash-signals/signal2.tests
===================================================================
--- trunk/busybox/shell/ash_test/ash-signals/signal2.tests (rev 0)
+++ trunk/busybox/shell/ash_test/ash-signals/signal2.tests 2008-07-26 13:45:57 UTC (rev 22948)
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+$THIS_SH -c '
+cleanup() {
+ echo "child exits as expected"
+ exit
+}
+trap cleanup HUP
+echo "sleeping"
+sleep 1
+echo "BAD exit from child!"
+' &
+
+child=$!
+sleep 0.1 # let child install handler first
+kill -HUP $child
+wait
+echo "parent exits"
Property changes on: trunk/busybox/shell/ash_test/ash-signals/signal2.tests
___________________________________________________________________
Name: svn:executable
+ *
More information about the busybox-cvs
mailing list