|
@@ -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;
|