14e7d1b39e
Copy from shells/dash based on submit request 32541 from user gberh OBS-URL: https://build.opensuse.org/request/show/32541 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/dash?expand=0&rev=1
97 lines
2.4 KiB
Diff
97 lines
2.4 KiB
Diff
From: Herbert Xu <herbert@gondor.apana.org.au>
|
|
Date: Sat, 27 Jun 2009 12:38:23 +0000 (+0800)
|
|
Subject: [REDIR] Fix incorrect savefd conversions
|
|
X-Git-Url: http://git.kernel.org/?p=utils%2Fdash%2Fdash.git;a=commitdiff_plain;h=6c0398654015de53269a2ef32eae3c7b560875dd
|
|
|
|
[REDIR] Fix incorrect savefd conversions
|
|
|
|
When I added savefd we may end up closing stderr if that is how
|
|
we get to the tty. This patch fixes by adding a second argument
|
|
to indicate what fd should be closed which lets jobs.c get around
|
|
the problem.
|
|
|
|
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
|
---
|
|
|
|
diff --git a/src/input.c b/src/input.c
|
|
index 27c4fd1..1e198e9 100644
|
|
--- a/src/input.c
|
|
+++ b/src/input.c
|
|
@@ -410,7 +410,7 @@ setinputfile(const char *fname, int flags)
|
|
sh_error("Can't open %s", fname);
|
|
}
|
|
if (fd < 10)
|
|
- fd = savefd(fd);
|
|
+ fd = savefd(fd, fd);
|
|
setinputfd(fd, flags & INPUT_PUSH_FILE);
|
|
out:
|
|
INTON;
|
|
diff --git a/src/jobs.c b/src/jobs.c
|
|
index b1ab7ab..a4fada0 100644
|
|
--- a/src/jobs.c
|
|
+++ b/src/jobs.c
|
|
@@ -189,17 +189,15 @@ setjobctl(int on)
|
|
if (on == jobctl || rootshell == 0)
|
|
return;
|
|
if (on) {
|
|
- fd = open(_PATH_TTY, O_RDWR);
|
|
+ int ofd;
|
|
+ ofd = fd = open(_PATH_TTY, O_RDWR);
|
|
if (fd < 0) {
|
|
fd += 3;
|
|
while (!isatty(fd))
|
|
if (--fd < 0)
|
|
goto out;
|
|
- fd = dup(fd);
|
|
- if (fd < 0)
|
|
- goto out;
|
|
}
|
|
- fd = savefd(fd);
|
|
+ fd = savefd(fd, ofd);
|
|
do { /* while we are in the background */
|
|
if ((pgrp = tcgetpgrp(fd)) < 0) {
|
|
out:
|
|
diff --git a/src/redir.c b/src/redir.c
|
|
index ce34db0..b01237d 100644
|
|
--- a/src/redir.c
|
|
+++ b/src/redir.c
|
|
@@ -145,7 +145,7 @@ redirect(union node *redir, int flags)
|
|
if (likely(i == EMPTY)) {
|
|
i = CLOSED;
|
|
if (fd != newfd) {
|
|
- i = savefd(fd);
|
|
+ i = savefd(fd, fd);
|
|
fd = -1;
|
|
}
|
|
}
|
|
@@ -399,7 +399,7 @@ RESET {
|
|
*/
|
|
|
|
int
|
|
-savefd(int from)
|
|
+savefd(int from, int ofd)
|
|
{
|
|
int newfd;
|
|
int err;
|
|
@@ -407,7 +407,7 @@ savefd(int from)
|
|
newfd = fcntl(from, F_DUPFD, 10);
|
|
err = newfd < 0 ? errno : 0;
|
|
if (err != EBADF) {
|
|
- close(from);
|
|
+ close(ofd);
|
|
if (err)
|
|
sh_error("%d: %s", from, strerror(err));
|
|
else
|
|
diff --git a/src/redir.h b/src/redir.h
|
|
index a8e6630..d1d160e 100644
|
|
--- a/src/redir.h
|
|
+++ b/src/redir.h
|
|
@@ -45,6 +45,6 @@ union node;
|
|
void redirect(union node *, int);
|
|
void popredir(int);
|
|
void clearredir(void);
|
|
-int savefd(int);
|
|
+int savefd(int, int);
|
|
int redirectsafe(union node *, int);
|
|
|