From caaf7d443d8f502a209cb5489c45ddcccbebdd34 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Fri, 22 Nov 2013 15:55:58 -0500 Subject: fix fd leak and case where fd 1 is already closed in wordexp --- src/misc/wordexp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/misc/wordexp.c b/src/misc/wordexp.c index 8f0d42f5..1387b5d2 100644 --- a/src/misc/wordexp.c +++ b/src/misc/wordexp.c @@ -8,6 +8,7 @@ #include #include #include +#include #include "pthread_impl.h" 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; } - if (pipe(p) < 0) goto nospace; + if (pipe2(p, O_CLOEXEC) < 0) goto nospace; __block_all_sigs(&set); pid = fork(); __restore_sigs(&set); @@ -98,9 +99,8 @@ static int do_wordexp(const char *s, wordexp_t *we, int flags) goto nospace; } if (!pid) { - dup2(p[1], 1); - close(p[0]); - close(p[1]); + if (p[1] == 1) fcntl(1, F_SETFD, 0); + else dup2(p[1], 1); execl("/bin/sh", "sh", "-c", "eval \"printf %s\\\\\\\\0 x $1 $2\"", "sh", s, redir, (char *)0); -- cgit v1.2.1