ash: fix a case where we close wrong descriptor; add debug hack for that

This commit is contained in:
Denis Vlasenko 2009-03-20 01:24:08 +00:00
parent f173395c4a
commit b9e70ddf2d

View File

@ -260,6 +260,12 @@ static void trace_printf(const char *fmt, ...);
static void trace_vprintf(const char *fmt, va_list va); static void trace_vprintf(const char *fmt, va_list va);
# define TRACE(param) trace_printf param # define TRACE(param) trace_printf param
# define TRACEV(param) trace_vprintf 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 #else
# define TRACE(param) # define TRACE(param)
# define TRACEV(param) # define TRACEV(param)
@ -5142,7 +5148,9 @@ redirect(union node *redir, int flags)
if (newfd < 0) { if (newfd < 0) {
/* NTOFD/NFROMFD: copy redir->ndup.dupfd to fd */ /* NTOFD/NFROMFD: copy redir->ndup.dupfd to fd */
if (redir->ndup.dupfd < 0) { /* "fd>&-" */ if (redir->ndup.dupfd < 0) { /* "fd>&-" */
close(fd); /* Don't want to trigger debugging */
if (fd != -1)
close(fd);
} else { } else {
copyfd(redir->ndup.dupfd, fd | COPYFD_EXACT); copyfd(redir->ndup.dupfd, fd | COPYFD_EXACT);
} }
@ -5195,7 +5203,7 @@ popredir(int drop, int restore)
/*close(fd);*/ /*close(fd);*/
copyfd(copy, fd | COPYFD_EXACT); copyfd(copy, fd | COPYFD_EXACT);
} }
close(copy); close(copy & ~COPYFD_RESTORE);
} }
} }
redirlist = rp->next; redirlist = rp->next;
@ -8416,7 +8424,9 @@ evalpipe(union node *n, int flags)
if (prevfd >= 0) if (prevfd >= 0)
close(prevfd); close(prevfd);
prevfd = pip[0]; 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) { if (n->npipe.pipe_backgnd == 0) {
exitstatus = waitforjob(jp); exitstatus = waitforjob(jp);