tech-userlevel archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: /bin/sh redirection in 'while' loop not closed afterwards?
On Tue, Sep 27, 2011 at 11:02:31PM +0200, Anthony Mallet wrote:
Content-Description: message body text
> On Tuesday, at 14:11, Christos Zoulas wrote:
> | Maybe the vfork() changes broke it a while ago. I would see if the FreeBSD
> | copy that does not have the vfork() changes suffers from the same issue.
>
> No vfork() issue. Looking at FreeBSD's version was still interesting since it
> confirmed the origin of the problem. The attached patch fix the problem for me
> - however I did not run intensive tests.
Ah - actually looked at the full function.....
Something like:
for (n = redir ; n ; n = n->nfile.next) {
fd = n->nfile.fd;
if ((n->nfile.type == NTOFD || n->nfile.type == NFROMFD) &&
n->ndup.dupfd == fd)
continue; /* redirect from/to same file descriptor */
INTOFF;
if ((flags & REDIR_PUSH) && sv->renamed[fd] == EMPTY) {
sv_fd = fcntl(fd, F_DUPFD, 10);
if (sv_fd != -1)
sv->renamed[fd] = sv_fd;
else {
if (errno != EBADF) {
INTON;
error("%d: %s", fd, strerror(errno));
/* NOTREACHED */
}
}
}
close(fd);
INTON;
if (fd == 0)
fd0_redirected++;
openredirect(n, memory, flags);
}
makes the logic clearer and probably works.
Of couse, there should be a check the reason the F_DUPFD failed is a
problem with the source fd, not something else (eg RLIMIT_NOFILES < 10),
not sure which system call has no side effects! The ioctl() isatty() uses
is probably safe.
David
--
David Laight: david%l8s.co.uk@localhost
Home |
Main Index |
Thread Index |
Old Index