summaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorDenis Vlasenko2009-03-20 01:24:08 +0000
committerDenis Vlasenko2009-03-20 01:24:08 +0000
commitb9e70ddf2d27767ec45701267f0adde6033e7fd9 (patch)
tree2271d3e87086507b0d178a674d42d909b8d1eb89 /shell
parentf173395c4a2a643017aeae14c1d1346035986e22 (diff)
downloadbusybox-b9e70ddf2d27767ec45701267f0adde6033e7fd9.zip
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.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/shell/ash.c b/shell/ash.c
index a799cb1..13efbbb 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);