提交 caaf7d44 编写于 作者: R Rich Felker

fix fd leak and case where fd 1 is already closed in wordexp

上级 8253f59e
...@@ -8,6 +8,7 @@ ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册