fix fd leak and case where fd 1 is already closed in wordexp
This commit is contained in:
parent
8253f59eae
commit
caaf7d443d
1 changed files with 4 additions and 4 deletions
|
|
@ -8,6 +8,7 @@
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include "pthread_impl.h"
|
#include "pthread_impl.h"
|
||||||
|
|
||||||
static char *getword(FILE *f)
|
static char *getword(FILE *f)
|
||||||
|
|
@ -88,7 +89,7 @@ static int do_wordexp(const char *s, wordexp_t *we, int flags)
|
||||||
we->we_offs = 0;
|
we->we_offs = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pipe(p) < 0) goto nospace;
|
if (pipe2(p, O_CLOEXEC) < 0) goto nospace;
|
||||||
__block_all_sigs(&set);
|
__block_all_sigs(&set);
|
||||||
pid = fork();
|
pid = fork();
|
||||||
__restore_sigs(&set);
|
__restore_sigs(&set);
|
||||||
|
|
@ -98,9 +99,8 @@ static int do_wordexp(const char *s, wordexp_t *we, int flags)
|
||||||
goto nospace;
|
goto nospace;
|
||||||
}
|
}
|
||||||
if (!pid) {
|
if (!pid) {
|
||||||
dup2(p[1], 1);
|
if (p[1] == 1) fcntl(1, F_SETFD, 0);
|
||||||
close(p[0]);
|
else dup2(p[1], 1);
|
||||||
close(p[1]);
|
|
||||||
execl("/bin/sh", "sh", "-c",
|
execl("/bin/sh", "sh", "-c",
|
||||||
"eval \"printf %s\\\\\\\\0 x $1 $2\"",
|
"eval \"printf %s\\\\\\\\0 x $1 $2\"",
|
||||||
"sh", s, redir, (char *)0);
|
"sh", s, redir, (char *)0);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue