Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 18 Apr 2015 23:49:58 +0000 (UTC)
From:      Bryan Drewery <bdrewery@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r281718 - in head/bin/sh: . tests/builtins
Message-ID:  <201504182349.t3INnwZc002791@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bdrewery
Date: Sat Apr 18 23:49:57 2015
New Revision: 281718
URL: https://svnweb.freebsd.org/changeset/base/281718

Log:
  sh: Fix the trap builtin to be POSIX-compliant for 'trap exit SIG' and 'trap n n...'.
  
  The parser considered 'trap exit INT' to reset the default for both EXIT and
  INT. This beahvior is not POSIX compliant. This was avoided if a value was
  specified for 'exit', but then disallows exiting with the signal received. A
  possible workaround is using ' exit'.
  
  However POSIX does allow this type of behavior if the parameters are all
  integers. Fix the handling for this and clarify its support in the manpage
  since it is specifically allowed by POSIX.
  
  Differential Revision:	https://reviews.freebsd.org/D2325
  Reviewed by:	jilles
  MFC after:	2 weeks

Added:
  head/bin/sh/tests/builtins/trap15.0   (contents, props changed)
  head/bin/sh/tests/builtins/trap16.0   (contents, props changed)
Modified:
  head/bin/sh/sh.1
  head/bin/sh/tests/builtins/Makefile
  head/bin/sh/trap.c

Modified: head/bin/sh/sh.1
==============================================================================
--- head/bin/sh/sh.1	Sat Apr 18 23:08:52 2015	(r281717)
+++ head/bin/sh/sh.1	Sat Apr 18 23:49:57 2015	(r281718)
@@ -32,7 +32,7 @@
 .\"	from: @(#)sh.1	8.6 (Berkeley) 5/4/95
 .\" $FreeBSD$
 .\"
-.Dd February 22, 2015
+.Dd April 18, 2015
 .Dt SH 1
 .Os
 .Sh NAME
@@ -2574,8 +2574,7 @@ the former causes the specified signal t
 and the latter causes the default action to be taken.
 Omitting the
 .Ar action
-is another way to request the default action, for compatibility reasons this
-usage is not recommended though.
+and using only signal numbers is another way to request the default action.
 In a subshell or utility environment,
 the shell resets trapped (but not ignored) signals to the default action.
 The

Modified: head/bin/sh/tests/builtins/Makefile
==============================================================================
--- head/bin/sh/tests/builtins/Makefile	Sat Apr 18 23:08:52 2015	(r281717)
+++ head/bin/sh/tests/builtins/Makefile	Sat Apr 18 23:49:57 2015	(r281718)
@@ -137,6 +137,8 @@ FILES+=		trap11.0
 FILES+=		trap12.0
 FILES+=		trap13.0
 FILES+=		trap14.0
+FILES+=		trap15.0
+FILES+=		trap16.0
 FILES+=		trap2.0
 FILES+=		trap3.0
 FILES+=		trap4.0

Added: head/bin/sh/tests/builtins/trap15.0
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/bin/sh/tests/builtins/trap15.0	Sat Apr 18 23:49:57 2015	(r281718)
@@ -0,0 +1,5 @@
+# $FreeBSD$
+
+(${SH} -c 'term(){ exit 5;}; trap term TERM; kill -TERM $$') &
+wait >/dev/null 2>&1 $!
+[ $? -eq 5 ]

Added: head/bin/sh/tests/builtins/trap16.0
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/bin/sh/tests/builtins/trap16.0	Sat Apr 18 23:49:57 2015	(r281718)
@@ -0,0 +1,20 @@
+# $FreeBSD$
+
+traps=$(${SH} -c 'trap "echo bad" 0; trap - 0; trap')
+[ -z "$traps" ] || exit 1
+traps=$(${SH} -c 'trap "echo bad" 0; trap "" 0; trap')
+expected_traps=$(${SH} -c 'trap "" EXIT; trap')
+[ "$traps" = "$expected_traps" ] || exit 2
+traps=$(${SH} -c 'trap "echo bad" 0; trap 0; trap')
+[ -z "$traps" ] || exit 3
+traps=$(${SH} -c 'trap "echo bad" 0; trap -- 0; trap')
+[ -z "$traps" ] || exit 4
+traps=$(${SH} -c 'trap "echo bad" 0 1 2; trap - 0 1 2; trap')
+[ -z "$traps" ] || exit 5
+traps=$(${SH} -c 'trap "echo bad" 0 1 2; trap "" 0 1 2; trap')
+expected_traps=$(${SH} -c 'trap "" EXIT HUP INT; trap')
+[ "$traps" = "$expected_traps" ] || exit 6
+traps=$(${SH} -c 'trap "echo bad" 0 1 2; trap 0 1 2; trap')
+[ -z "$traps" ] || exit 7
+traps=$(${SH} -c 'trap "echo bad" 0 1 2; trap -- 0 1 2; trap')
+[ -z "$traps" ] || exit 8

Modified: head/bin/sh/trap.c
==============================================================================
--- head/bin/sh/trap.c	Sat Apr 18 23:08:52 2015	(r281717)
+++ head/bin/sh/trap.c	Sat Apr 18 23:49:57 2015	(r281718)
@@ -183,7 +183,7 @@ trapcmd(int argc __unused, char **argv)
 		return 0;
 	}
 	action = NULL;
-	if (*argv && sigstring_to_signum(*argv) == -1) {
+	if (*argv && !is_number(*argv)) {
 		if (strcmp(*argv, "-") == 0)
 			argv++;
 		else {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201504182349.t3INnwZc002791>