diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2016-08-22 19:54:12 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2016-08-22 19:54:12 +0200 |
commit | aa3576a29b9619f4e1c1b131f5db53ad2bc2cb00 (patch) | |
tree | 9dba84b07e8dda7f82a8dba84299bab21e6b9fd2 /shell/hush_test | |
parent | d8e61bbf13d0cf38d477255cfd5dc71c5d51d575 (diff) | |
download | busybox-w32-aa3576a29b9619f4e1c1b131f5db53ad2bc2cb00.tar.gz busybox-w32-aa3576a29b9619f4e1c1b131f5db53ad2bc2cb00.tar.bz2 busybox-w32-aa3576a29b9619f4e1c1b131f5db53ad2bc2cb00.zip |
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.right | 1 | ||||
-rwxr-xr-x | shell/hush_test/hush-misc/redir_script.tests | 29 |
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 000000000..6694ed334 --- /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 000000000..ccc497d7b --- /dev/null +++ b/shell/hush_test/hush-misc/redir_script.tests | |||
@@ -0,0 +1,29 @@ | |||
1 | # Builds a " 3>&- 4>&-" string. | ||
2 | # Note: one of these fds is a directory opened to /proc/self/fd | ||
3 | # for globbing. It is unwanted, but I don't know how to filter it out. | ||
4 | find_fds() { | ||
5 | fds="" | ||
6 | for f in /proc/self/fd/*; do | ||
7 | test "$f" = "/proc/self/fd/0" && continue | ||
8 | test "$f" = "/proc/self/fd/1" && continue | ||
9 | test "$f" = "/proc/self/fd/2" && continue | ||
10 | fds="$fds ${f##*/}>&-" | ||
11 | done | ||
12 | } | ||
13 | |||
14 | find_fds | ||
15 | fds1="$fds" | ||
16 | |||
17 | # One of the fds is open to the script body | ||
18 | # Close it while executing something. | ||
19 | eval "find_fds $fds" | ||
20 | |||
21 | # Shell should not lose that fd. Did it? | ||
22 | find_fds | ||
23 | test x"$fds1" = x"$fds" && { echo "Ok: script fd is not closed"; exit 0; } | ||
24 | |||
25 | echo "Bug: script fd is closed" | ||
26 | echo "fds1:$fds1" | ||
27 | echo "fds2:$fds" | ||
28 | exit 1 | ||
29 | |||