summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorjilles <jilles@FreeBSD.org>2009-12-25 20:21:35 +0000
committerjilles <jilles@FreeBSD.org>2009-12-25 20:21:35 +0000
commit545cc5fec7115d450d5b76c2f598d1eafb16d592 (patch)
tree70cc7efa48eb3f1089f61e3030e19359262db521 /tools
parent2f4287b1338caa52535b49c6af74ecf62ecdb8ed (diff)
downloadFreeBSD-src-545cc5fec7115d450d5b76c2f598d1eafb16d592.zip
FreeBSD-src-545cc5fec7115d450d5b76c2f598d1eafb16d592.tar.gz
sh: Do not run callers' exception handlers in subshells.
Reset the exception handler in the child to main's. This avoids inappropriate double cleanups or shell duplication when the exception is caught, such as 'fc' and future 'command eval' and 'command .'.
Diffstat (limited to 'tools')
-rw-r--r--tools/regression/bin/sh/builtins/fc2.034
1 files changed, 34 insertions, 0 deletions
diff --git a/tools/regression/bin/sh/builtins/fc2.0 b/tools/regression/bin/sh/builtins/fc2.0
new file mode 100644
index 0000000..dc4b6de
--- /dev/null
+++ b/tools/regression/bin/sh/builtins/fc2.0
@@ -0,0 +1,34 @@
+# $FreeBSD$
+set -e
+trap 'echo Broken pipe -- test failed' pipe
+
+P=${TMPDIR:-/tmp}
+cd $P
+T=$(mktemp -d sh-test.XXXXXX)
+cd $T
+
+mkfifo input output error
+HISTFILE=/dev/null sh +m -i <input >output 2>error &
+exec 3>input
+{
+ # Command not found, containing slash
+ echo '/var/empty/nonexistent' >&3
+ # Read error message, shell will read new input now
+ read dummy <&5
+ # Execute bad command again
+ echo 'fc -e true; echo continued' >&3
+ read dummy <&5
+ read line <&4 && [ "$line" = continued ] && : ${rc:=0}
+ exec 3>&-
+ # Old sh duplicates itself after the fc, producing another line
+ # of output.
+ if read line <&4; then
+ echo "Extraneous output: $line"
+ rc=1
+ fi
+} 4<output 5<error
+exec 3>&-
+
+rm input output error
+rmdir ${P}/${T}
+exit ${rc:-3}
OpenPOWER on IntegriCloud