ash: trap with bad signal name should not abort
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 26 Mar 2010 14:52:24 +0000 (15:52 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 26 Mar 2010 14:52:24 +0000 (15:52 +0100)
function                                             old     new   delta
trapcmd                                              236     271     +35

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c
shell/ash_test/ash-signals/signal4.right [new file with mode: 0644]
shell/ash_test/ash-signals/signal4.tests [new file with mode: 0755]

index e2851305bab50b3015772d80f795286dd32e1b36..0cfa4fc6ffa6957c1ff4f34d7c3f446bbfd49fe9 100644 (file)
@@ -12281,7 +12281,7 @@ trapcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
 {
        char *action;
        char **ap;
-       int signo;
+       int signo, exitcode;
 
        nextopt(nullstr);
        ap = argptr;
@@ -12314,10 +12314,15 @@ trapcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
        action = NULL;
        if (ap[1])
                action = *ap++;
+       exitcode = 0;
        while (*ap) {
                signo = get_signum(*ap);
-               if (signo < 0)
-                       ash_msg_and_raise_error("%s: bad trap", *ap);
+               if (signo < 0) {
+                       /* Mimic bash message exactly */
+                       ash_msg("%s: invalid signal specification", *ap);
+                       exitcode = 1;
+                       goto next;
+               }
                INT_OFF;
                if (action) {
                        if (LONE_DASH(action))
@@ -12330,9 +12335,10 @@ trapcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
                if (signo != 0)
                        setsignal(signo);
                INT_ON;
+ next:
                ap++;
        }
-       return 0;
+       return exitcode;
 }
 
 
diff --git a/shell/ash_test/ash-signals/signal4.right b/shell/ash_test/ash-signals/signal4.right
new file mode 100644 (file)
index 0000000..3260584
--- /dev/null
@@ -0,0 +1,4 @@
+./signal4.tests: trap: line 3: BADNAME: invalid signal specification
+1
+Trapped
+Ok
diff --git a/shell/ash_test/ash-signals/signal4.tests b/shell/ash_test/ash-signals/signal4.tests
new file mode 100755 (executable)
index 0000000..6f1c4a9
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+trap "echo Trapped" BADNAME TERM; echo $?
+kill $$
+echo Ok