hush: fix multiple redirections of the same fd (bug 227)

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2009-05-02 14:17:31 +02:00
parent 54e0843e7d
commit 1dd6cf8677
3 changed files with 15 additions and 2 deletions

View File

@ -2646,7 +2646,9 @@ static int setup_redirects(struct command *prog, int squirrel[])
for (redir = prog->redirects; redir; redir = redir->next) { for (redir = prog->redirects; redir; redir = redir->next) {
if (redir->rd_type == REDIRECT_HEREDOC2) { if (redir->rd_type == REDIRECT_HEREDOC2) {
/* rd_fd<<HERE case */ /* rd_fd<<HERE case */
if (squirrel && redir->rd_fd < 3) { if (squirrel && redir->rd_fd < 3
&& squirrel[redir->rd_fd] < 0
) {
squirrel[redir->rd_fd] = dup(redir->rd_fd); squirrel[redir->rd_fd] = dup(redir->rd_fd);
} }
/* for REDIRECT_HEREDOC2, rd_filename holds _contents_ /* for REDIRECT_HEREDOC2, rd_filename holds _contents_
@ -2682,7 +2684,9 @@ static int setup_redirects(struct command *prog, int squirrel[])
} }
if (openfd != redir->rd_fd) { if (openfd != redir->rd_fd) {
if (squirrel && redir->rd_fd < 3) { if (squirrel && redir->rd_fd < 3
&& squirrel[redir->rd_fd] < 0
) {
squirrel[redir->rd_fd] = dup(redir->rd_fd); squirrel[redir->rd_fd] = dup(redir->rd_fd);
} }
if (openfd == REDIRFD_CLOSE) { if (openfd == REDIRFD_CLOSE) {

View File

@ -0,0 +1,4 @@
Testing multiple redirections to same fd
Hello
Done1
Done2

View File

@ -0,0 +1,5 @@
echo "Testing multiple redirections to same fd"
# bug was making us lose fd #1 after this:
echo Hello >/dev/null 1>&2
echo Done1
echo Done2 >&2