From 496d5bf4c6566b7837e61fa83da3fb5851ae446b Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 26 Mar 2010 15:52:24 +0100 Subject: [PATCH] ash: trap with bad signal name should not abort function old new delta trapcmd 236 271 +35 Signed-off-by: Denys Vlasenko --- shell/ash.c | 14 ++++++++++---- shell/ash_test/ash-signals/signal4.right | 4 ++++ shell/ash_test/ash-signals/signal4.tests | 5 +++++ 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 shell/ash_test/ash-signals/signal4.right create mode 100755 shell/ash_test/ash-signals/signal4.tests diff --git a/shell/ash.c b/shell/ash.c index e2851305b..0cfa4fc6f 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -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 index 000000000..32605849c --- /dev/null +++ b/shell/ash_test/ash-signals/signal4.right @@ -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 index 000000000..6f1c4a950 --- /dev/null +++ b/shell/ash_test/ash-signals/signal4.tests @@ -0,0 +1,5 @@ +#!/bin/sh + +trap "echo Trapped" BADNAME TERM; echo $? +kill $$ +echo Ok