mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-18 04:19:21 +08:00
* libc/posix/wordexp.c (wordexp): Handle expanded words longer
than 500 bytes.
This commit is contained in:
parent
ca8170a6c3
commit
4a6ec9ec52
@ -1,3 +1,8 @@
|
||||
2012-10-09 Peter Rosin <peda@lysator.liu.se>
|
||||
|
||||
* libc/posix/wordexp.c (wordexp): Handle expanded words longer
|
||||
than 500 bytes.
|
||||
|
||||
2012-10-09 Peter Rosin <peda@lysator.liu.se>
|
||||
|
||||
* libc/posix/wordexp.c (wordexp): Don't leak file streams.
|
||||
|
@ -37,9 +37,12 @@ wordexp(const char *words, wordexp_t *pwordexp, int flags)
|
||||
char *iter;
|
||||
pid_t pid;
|
||||
int num_words = 0;
|
||||
int num_bytes = 0;
|
||||
int fd[2];
|
||||
int fd_err[2];
|
||||
int err = 0;
|
||||
char *ewords;
|
||||
char *eword;
|
||||
|
||||
if (pwordexp == NULL)
|
||||
{
|
||||
@ -122,27 +125,37 @@ wordexp(const char *words, wordexp_t *pwordexp, int flags)
|
||||
(pwordexp->we_wordc + num_words + offs + 1) * sizeof(char *))))
|
||||
return WRDE_NOSPACE;
|
||||
|
||||
/* Get number of bytes required for storage of num_words words. */
|
||||
/* Get number of bytes required for storage of all num_words words. */
|
||||
fgets(tmp, MAXLINELEN, f);
|
||||
|
||||
if((iter = strchr(tmp, '\n')))
|
||||
*iter = '\0';
|
||||
|
||||
/* Get each expansion from the shell output, and store each in
|
||||
pwordexp's we_wordv vector. */
|
||||
num_bytes = atoi(tmp);
|
||||
|
||||
/* Get expansion from the shell output. */
|
||||
if (!(ewords = (char *)malloc(num_bytes + num_words + 1)))
|
||||
return WRDE_NOSPACE;
|
||||
fread(ewords, 1, num_bytes + num_words, f);
|
||||
ewords[num_bytes + num_words] = 0;
|
||||
|
||||
/* Store each entry in pwordexp's we_wordv vector. */
|
||||
eword = ewords;
|
||||
for(i = 0; i < num_words; i++)
|
||||
{
|
||||
fgets(tmp, MAXLINELEN, f);
|
||||
|
||||
if((iter = strchr(tmp, '\n')))
|
||||
if (eword && (iter = strchr(eword, '\n')))
|
||||
*iter = '\0';
|
||||
|
||||
pwordexp->we_wordv[pwordexp->we_wordc + offs + i] = strdup(tmp);
|
||||
if (eword)
|
||||
eword = strdup(eword);
|
||||
pwordexp->we_wordv[pwordexp->we_wordc + offs + i] = eword;
|
||||
eword = iter ? iter + 1 : iter;
|
||||
}
|
||||
|
||||
pwordexp->we_wordv[pwordexp->we_wordc + offs + i] = NULL;
|
||||
pwordexp->we_wordc += num_words;
|
||||
|
||||
free(ewords);
|
||||
fclose(f);
|
||||
fclose(f_err);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user