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 | |
parent | f173395c4a2a643017aeae14c1d1346035986e22 (diff) | |
download | busybox-w32-b9e70ddf2d27767ec45701267f0adde6033e7fd9.tar.gz busybox-w32-b9e70ddf2d27767ec45701267f0adde6033e7fd9.tar.bz2 busybox-w32-b9e70ddf2d27767ec45701267f0adde6033e7fd9.zip |
ash: fix a case where we close wrong descriptor; add debug hack for that
-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, ...); | |||
260 | static void trace_vprintf(const char *fmt, va_list va); | 260 | static void trace_vprintf(const char *fmt, va_list va); |
261 | # define TRACE(param) trace_printf param | 261 | # define TRACE(param) trace_printf param |
262 | # define TRACEV(param) trace_vprintf param | 262 | # define TRACEV(param) trace_vprintf param |
263 | # define close(f) do { \ | ||
264 | int dfd = (f); \ | ||
265 | if (close(dfd) < 0) \ | ||
266 | bb_error_msg("bug on %d: closing %d(%x)", \ | ||
267 | __LINE__, dfd dfd); \ | ||
268 | } while (0) | ||
263 | #else | 269 | #else |
264 | # define TRACE(param) | 270 | # define TRACE(param) |
265 | # define TRACEV(param) | 271 | # define TRACEV(param) |
@@ -5142,7 +5148,9 @@ redirect(union node *redir, int flags) | |||
5142 | if (newfd < 0) { | 5148 | if (newfd < 0) { |
5143 | /* NTOFD/NFROMFD: copy redir->ndup.dupfd to fd */ | 5149 | /* NTOFD/NFROMFD: copy redir->ndup.dupfd to fd */ |
5144 | if (redir->ndup.dupfd < 0) { /* "fd>&-" */ | 5150 | if (redir->ndup.dupfd < 0) { /* "fd>&-" */ |
5145 | close(fd); | 5151 | /* Don't want to trigger debugging */ |
5152 | if (fd != -1) | ||
5153 | close(fd); | ||
5146 | } else { | 5154 | } else { |
5147 | copyfd(redir->ndup.dupfd, fd | COPYFD_EXACT); | 5155 | copyfd(redir->ndup.dupfd, fd | COPYFD_EXACT); |
5148 | } | 5156 | } |
@@ -5195,7 +5203,7 @@ popredir(int drop, int restore) | |||
5195 | /*close(fd);*/ | 5203 | /*close(fd);*/ |
5196 | copyfd(copy, fd | COPYFD_EXACT); | 5204 | copyfd(copy, fd | COPYFD_EXACT); |
5197 | } | 5205 | } |
5198 | close(copy); | 5206 | close(copy & ~COPYFD_RESTORE); |
5199 | } | 5207 | } |
5200 | } | 5208 | } |
5201 | redirlist = rp->next; | 5209 | redirlist = rp->next; |
@@ -8416,7 +8424,9 @@ evalpipe(union node *n, int flags) | |||
8416 | if (prevfd >= 0) | 8424 | if (prevfd >= 0) |
8417 | close(prevfd); | 8425 | close(prevfd); |
8418 | prevfd = pip[0]; | 8426 | prevfd = pip[0]; |
8419 | close(pip[1]); | 8427 | /* Don't want to trigger debugging */ |
8428 | if (pip[1] != -1) | ||
8429 | close(pip[1]); | ||
8420 | } | 8430 | } |
8421 | if (n->npipe.pipe_backgnd == 0) { | 8431 | if (n->npipe.pipe_backgnd == 0) { |
8422 | exitstatus = waitforjob(jp); | 8432 | exitstatus = waitforjob(jp); |