- Subject: [PATCH] [SHELL] execute EXIT trap if the shell is killed through a signal
- From: Gerrit Pape <pape@xxxxxxxxxxx>
- Date: Wed, 11 Feb 2009 14:55:08 +0000
- Mail-followup-to: dash@xxxxxxxxxxxxxxx
From: Chris Lamb <chris@xxxxxxxxxxxxxxxx>
dash used to print the following output when running this test script
$ dash -c 'trap "echo EXIT trap executed" EXIT; kill -HUP $$'
Hangup
$
With this commit, it properly executes the EXIT trap defined
$ dash -c 'trap "echo EXIT trap executed" EXIT; kill -HUP $$'
EXIT trap executed
$
The missing trap handling was reported by Martin Dickopp through
http://bugs.debian.org/390433
Patch is from Chris Lamb.
Signed-off-by: Gerrit Pape <pape@xxxxxxxxxxx>
---
src/trap.c | 28 +++++++++++++++++++++++-----
1 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/src/trap.c b/src/trap.c
index 58cd0cc..732fd41 100644
--- a/src/trap.c
+++ b/src/trap.c
@@ -67,6 +67,8 @@
#define S_HARD_IGN 4 /* signal is ignored permenantly */
#define S_RESET 5 /* temporary - to reset a hard ignored sig */
+#define SIGEXIT 0
+#define DUMMY_ACTION savestr(":")
/* trap handler commands */
char *trap[NSIG];
@@ -97,7 +99,7 @@ trapcmd(int argc, char **argv)
{
char *action;
char **ap;
- int signo;
+ int signo, dummysig;
nextopt(nullstr);
ap = argptr;
@@ -122,16 +124,32 @@ trapcmd(int argc, char **argv)
sh_error("%s: bad trap", *ap);
INTOFF;
if (action) {
- if (action[0] == '-' && action[1] == '\0')
- action = NULL;
- else
+ if (action[0] == '-' && action[1] == '\0') {
+ if (signo != SIGEXIT && trap[0] != NULL)
+ /* Reset dummy handler */
+ action = DUMMY_ACTION;
+ else
+ action = NULL;
+ } else {
action = savestr(action);
+ }
+ } else {
+ action = DUMMY_ACTION;
}
if (trap[signo])
ckfree(trap[signo]);
trap[signo] = action;
- if (signo != 0)
+ if (signo == SIGEXIT) {
+ /* Set dummy handlers */
+ for (dummysig = 1 ; dummysig < NSIG ; dummysig++) {
+ if (trap[dummysig] == NULL) {
+ trap[dummysig] = DUMMY_ACTION;
+ setsignal(dummysig);
+ }
+ }
+ } else {
setsignal(signo);
+ }
INTON;
ap++;
}
--
1.6.1.2.346.g8600b3.dirty
--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
[LARTC]
[Bugtraq]
[Yosemite Forum]
[Photo]