diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2009-03-20 01:24:08 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2009-03-20 01:24:08 +0000 |
commit | b9e70ddf2d27767ec45701267f0adde6033e7fd9 (patch) | |
tree | 2271d3e87086507b0d178a674d42d909b8d1eb89 /shell | |
parent | f173395c4a2a643017aeae14c1d1346035986e22 (diff) | |
download | busybox-b9e70ddf2d27767ec45701267f0adde6033e7fd9.tar.gz |
ash: fix a case where we close wrong descriptor; add debug hack for that
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ash.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/shell/ash.c b/shell/ash.c index a799cb1a6..13efbbb87 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -260,6 +260,12 @@ static void trace_printf(const char *fmt, ...); static void trace_vprintf(const char *fmt, va_list va); # define TRACE(param) trace_printf param # define TRACEV(param) trace_vprintf param +# define close(f) do { \ + int dfd = (f); \ + if (close(dfd) < 0) \ + bb_error_msg("bug on %d: closing %d(%x)", \ + __LINE__, dfd dfd); \ +} while (0) #else # define TRACE(param) # define TRACEV(param) @@ -5142,7 +5148,9 @@ redirect(union node *redir, int flags) if (newfd < 0) { /* NTOFD/NFROMFD: copy redir->ndup.dupfd to fd */ if (redir->ndup.dupfd < 0) { /* "fd>&-" */ - close(fd); + /* Don't want to trigger debugging */ + if (fd != -1) + close(fd); } else { copyfd(redir->ndup.dupfd, fd | COPYFD_EXACT); } @@ -5195,7 +5203,7 @@ popredir(int drop, int restore) /*close(fd);*/ copyfd(copy, fd | COPYFD_EXACT); } - close(copy); + close(copy & ~COPYFD_RESTORE); } } redirlist = rp->next; @@ -8416,7 +8424,9 @@ evalpipe(union node *n, int flags) if (prevfd >= 0) close(prevfd); prevfd = pip[0]; - close(pip[1]); + /* Don't want to trigger debugging */ + if (pip[1] != -1) + close(pip[1]); } if (n->npipe.pipe_backgnd == 0) { exitstatus = waitforjob(jp); |