svn commit: r364919 - in head/bin/sh: . tests/execution

Jilles Tjoelker jilles at FreeBSD.org
Fri Aug 28 15:35:47 UTC 2020


Author: jilles
Date: Fri Aug 28 15:35:45 2020
New Revision: 364919
URL: https://svnweb.freebsd.org/changeset/base/364919

Log:
  sh: Keep ignored SIGINT/SIGQUIT after set in a background job
  
  If job control is not enabled, a background job (... &) ignores SIGINT and
  SIGQUIT, but this can be reverted using the trap builtin in the same shell
  environment.
  
  Using the set builtin to change options would also revert SIGINT and SIGQUIT
  to their previous dispositions.
  
  This broke due to r317298. Calling setsignal() reverts the effect of
  ignoresig().
  
  Reported by:	bdrewery
  MFC after:	1 week

Added:
  head/bin/sh/tests/execution/bg13.0   (contents, props changed)
Modified:
  head/bin/sh/main.c
  head/bin/sh/tests/execution/Makefile
  head/bin/sh/trap.c
  head/bin/sh/trap.h

Modified: head/bin/sh/main.c
==============================================================================
--- head/bin/sh/main.c	Fri Aug 28 15:09:43 2020	(r364918)
+++ head/bin/sh/main.c	Fri Aug 28 15:35:45 2020	(r364919)
@@ -134,6 +134,7 @@ main(int argc, char *argv[])
 	setstackmark(&smark);
 	setstackmark(&smark2);
 	procargs(argc, argv);
+	trap_init();
 	pwd_init(iflag);
 	INTON;
 	if (iflag)

Modified: head/bin/sh/tests/execution/Makefile
==============================================================================
--- head/bin/sh/tests/execution/Makefile	Fri Aug 28 15:09:43 2020	(r364918)
+++ head/bin/sh/tests/execution/Makefile	Fri Aug 28 15:35:45 2020	(r364919)
@@ -19,6 +19,7 @@ ${PACKAGE}FILES+=		bg9.0
 ${PACKAGE}FILES+=		bg10.0 bg10.0.stdout
 ${PACKAGE}FILES+=		bg11.0
 ${PACKAGE}FILES+=		bg12.0
+${PACKAGE}FILES+=		bg13.0
 ${PACKAGE}FILES+=		env1.0
 ${PACKAGE}FILES+=		fork1.0
 ${PACKAGE}FILES+=		fork2.0

Added: head/bin/sh/tests/execution/bg13.0
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/bin/sh/tests/execution/bg13.0	Fri Aug 28 15:35:45 2020	(r364919)
@@ -0,0 +1,16 @@
+# $FreeBSD$
+
+T=`mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXXXX`
+trap 'rm -rf $T' 0
+cd $T || exit 3
+mkfifo fifo1
+# Use a trap, not the default action, since the shell may catch SIGINT and
+# therefore its processing may be delayed.
+{ set -C; trap 'exit 5' TERM; read dummy <fifo1; exit 4; } &
+exec 3>fifo1
+kill -INT "$!"
+kill -TERM "$!"
+exec 3>&-
+wait "$!"
+r=$?
+[ "$r" = 5 ]

Modified: head/bin/sh/trap.c
==============================================================================
--- head/bin/sh/trap.c	Fri Aug 28 15:09:43 2020	(r364918)
+++ head/bin/sh/trap.c	Fri Aug 28 15:35:45 2020	(r364919)
@@ -474,14 +474,20 @@ dotrap(void)
 }
 
 
+void
+trap_init(void)
+{
+	setsignal(SIGINT);
+	setsignal(SIGQUIT);
+}
+
+
 /*
  * Controls whether the shell is interactive or not based on iflag.
  */
 void
 setinteractive(void)
 {
-	setsignal(SIGINT);
-	setsignal(SIGQUIT);
 	setsignal(SIGTERM);
 }
 

Modified: head/bin/sh/trap.h
==============================================================================
--- head/bin/sh/trap.h	Fri Aug 28 15:09:43 2020	(r364918)
+++ head/bin/sh/trap.h	Fri Aug 28 15:35:45 2020	(r364919)
@@ -45,6 +45,7 @@ void ignoresig(int);
 int issigchldtrapped(void);
 void onsig(int);
 void dotrap(void);
+void trap_init(void);
 void setinteractive(void);
 void exitshell(int) __dead2;
 void exitshell_savedstatus(void) __dead2;


More information about the svn-src-all mailing list