035486c750
New code is similar to what hush is doing. Make CLOSED to -1: same as dash. popredir() loses "restore" parameter: same as dash. COPYFD_RESTORE bit is no longer necessary. This change fixes this interactive bug: $ ls -l /proc/$$/fd 10>&- ash: can't set tty process group: Bad file descriptor ash: can't set tty process group: Bad file descriptor [1]+ Done(2) ls -l /proc/${\$}/fd 10>&4294967295 function old new delta unwindredir 29 27 -2 tryexec 154 152 -2 evaltree 503 501 -2 evalcommand 1369 1367 -2 cmdloop 187 185 -2 redirect 1029 1018 -11 popredir 153 123 -30 need_to_remember 36 - -36 is_hidden_fd 68 - -68 ------------------------------------------------------------------------------ (add/remove: 0/2 grow/shrink: 0/7 up/down: 0/-155) Total: -155 bytes text data bss dec hex filename 914572 485 6848 921905 e1131 busybox_old 914553 485 6848 921886 e111e busybox_unstripped Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
35 lines
934 B
Plaintext
Executable File
35 lines
934 B
Plaintext
Executable File
# 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; }
|
|
|
|
# One legit way to handle it is to move script fd. For example, if we see that fd 10 moved to fd 11:
|
|
test x"$fds1" = x" 10>&- 3>&-" && \
|
|
test x"$fds" = x" 11>&- 3>&-" \
|
|
&& { echo "Ok: script fd is not closed"; exit 0; }
|
|
|
|
echo "Bug: script fd is closed"
|
|
echo "fds1:$fds1"
|
|
echo "fds2:$fds"
|
|
exit 1
|