projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge remote branch 'nsz/master'
[musl]
/
src
/
misc
/
wordexp.c
diff --git
a/src/misc/wordexp.c
b/src/misc/wordexp.c
index
171f270
..
4a3efc7
100644
(file)
--- a/
src/misc/wordexp.c
+++ b/
src/misc/wordexp.c
@@
-7,6
+7,7
@@
#include <stdlib.h>
#include <sys/wait.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/wait.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;
int sq=0, dq=0;
{
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;
}
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) {
dup2(p[1], 1);
close(p[0]);
if (!pid) {
dup2(p[1], 1);
close(p[0]);
@@
-130,10
+136,20
@@
int wordexp(const char *s, wordexp_t *we, int flags)
}
we->we_wordv = wv;
}
we->we_wordv = wv;
- we->we_wordc = i - we->we_offs;
+ we->we_wordc = i;
+ if (flags & WRDE_DOOFFS) we->we_wordc -= we->we_offs;
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)
{
size_t i;
void wordfree(wordexp_t *we)
{
size_t i;