aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2009-03-20 01:24:08 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2009-03-20 01:24:08 +0000
commitb9e70ddf2d27767ec45701267f0adde6033e7fd9 (patch)
tree2271d3e87086507b0d178a674d42d909b8d1eb89
parentf173395c4a2a643017aeae14c1d1346035986e22 (diff)
downloadbusybox-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.c16
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, ...);
260static void trace_vprintf(const char *fmt, va_list va); 260static 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);