mirror of git://git.musl-libc.org/musl
block cancellation in wordexp, handle more errors
This commit is contained in:
parent
f0fc95d439
commit
145c05345d
|
@ -7,6 +7,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
static char *getword(FILE *f)
|
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;
|
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;
|
size_t i, l;
|
||||||
int sq=0, dq=0;
|
int sq=0, dq=0;
|
||||||
|
@ -83,8 +84,13 @@ int wordexp(const char *s, wordexp_t *we, int flags)
|
||||||
i += we->we_offs;
|
i += we->we_offs;
|
||||||
}
|
}
|
||||||
|
|
||||||
pipe(p);
|
if (pipe(p) < 0) return WRDE_NOSPACE;
|
||||||
pid = fork();
|
pid = fork();
|
||||||
|
if (pid < 0) {
|
||||||
|
close(p[0]);
|
||||||
|
close(p[1]);
|
||||||
|
return WRDE_NOSPACE;
|
||||||
|
}
|
||||||
if (!pid) {
|
if (!pid) {
|
||||||
dup2(p[1], 1);
|
dup2(p[1], 1);
|
||||||
close(p[0]);
|
close(p[0]);
|
||||||
|
@ -134,6 +140,15 @@ int wordexp(const char *s, wordexp_t *we, int flags)
|
||||||
return err;
|
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)
|
void wordfree(wordexp_t *we)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
Loading…
Reference in New Issue