summaryrefslogtreecommitdiff
path: root/shell/hush_test
diff options
context:
space:
mode:
authorDenys Vlasenko2016-08-22 19:54:12 +0200
committerDenys Vlasenko2016-08-22 19:54:12 +0200
commitaa3576a29b9619f4e1c1b131f5db53ad2bc2cb00 (patch)
tree9dba84b07e8dda7f82a8dba84299bab21e6b9fd2 /shell/hush_test
parentd8e61bbf13d0cf38d477255cfd5dc71c5d51d575 (diff)
downloadbusybox-aa3576a29b9619f4e1c1b131f5db53ad2bc2cb00.zip
busybox-aa3576a29b9619f4e1c1b131f5db53ad2bc2cb00.tar.gz
hush: fix "redirects can close script fd" bug
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell/hush_test')
-rw-r--r--shell/hush_test/hush-misc/redir_script.right1
-rwxr-xr-xshell/hush_test/hush-misc/redir_script.tests29
2 files changed, 30 insertions, 0 deletions
diff --git a/shell/hush_test/hush-misc/redir_script.right b/shell/hush_test/hush-misc/redir_script.right
new file mode 100644
index 0000000..6694ed3
--- /dev/null
+++ b/shell/hush_test/hush-misc/redir_script.right
@@ -0,0 +1 @@
+Ok: script fd is not closed
diff --git a/shell/hush_test/hush-misc/redir_script.tests b/shell/hush_test/hush-misc/redir_script.tests
new file mode 100755
index 0000000..ccc497d
--- /dev/null
+++ b/shell/hush_test/hush-misc/redir_script.tests
@@ -0,0 +1,29 @@
+# Builds a " 3>&- 4>&-" string.
+# Note: one of these fds is a directory opened to /proc/self/fd
+# for globbing. It is unwanted, but I don't know how to filter it out.
+find_fds() {
+ fds=""
+ for f in /proc/self/fd/*; do
+ test "$f" = "/proc/self/fd/0" && continue
+ test "$f" = "/proc/self/fd/1" && continue
+ test "$f" = "/proc/self/fd/2" && continue
+ fds="$fds ${f##*/}>&-"
+ done
+}
+
+find_fds
+fds1="$fds"
+
+# One of the fds is open to the script body
+# Close it while executing something.
+eval "find_fds $fds"
+
+# Shell should not lose that fd. Did it?
+find_fds
+test x"$fds1" = x"$fds" && { echo "Ok: script fd is not closed"; exit 0; }
+
+echo "Bug: script fd is closed"
+echo "fds1:$fds1"
+echo "fds2:$fds"
+exit 1
+