block cancellation in wordexp, handle more errors

This commit is contained in:
Rich Felker 2011-04-19 23:42:56 -04:00
parent f0fc95d439
commit 145c05345d
1 changed files with 17 additions and 2 deletions

View File

@ -7,6 +7,7 @@
#include <stdlib.h>
#include <sys/wait.h>
#include <signal.h>
#include <pthread.h>
static char *getword(FILE *f)
{
@ -14,7 +15,7 @@ static char *getword(FILE *f)
return getdelim(&s, (size_t [1]){0}, 0, f) < 0 ? 0 : s;
}
int wordexp(const char *s, wordexp_t *we, int flags)
static int do_wordexp(const char *s, wordexp_t *we, int flags)
{
size_t i, l;
int sq=0, dq=0;
@ -83,8 +84,13 @@ int wordexp(const char *s, wordexp_t *we, int flags)
i += we->we_offs;
}
pipe(p);
if (pipe(p) < 0) return WRDE_NOSPACE;
pid = fork();
if (pid < 0) {
close(p[0]);
close(p[1]);
return WRDE_NOSPACE;
}
if (!pid) {
dup2(p[1], 1);
close(p[0]);
@ -134,6 +140,15 @@ int wordexp(const char *s, wordexp_t *we, int flags)
return err;
}
int wordexp(const char *s, wordexp_t *we, int flags)
{
int r, cs;
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
r = do_wordexp(s, we, flags);
pthread_setcancelstate(cs, 0);
return r;
}
void wordfree(wordexp_t *we)
{
size_t i;