From b9e70ddf2d27767ec45701267f0adde6033e7fd9 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Fri, 20 Mar 2009 01:24:08 +0000 Subject: [PATCH] ash: fix a case where we close wrong descriptor; add debug hack for that --- shell/ash.c | 16 +++++++++++++--- 1 file 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);