Minor fixes in wordsplit.c

This commit is contained in:
Sergey Poznyakoff
2018-08-02 16:36:48 +03:00
parent 016d6d27d1
commit 9042dfc4b1

View File

@@ -1070,6 +1070,7 @@ wsplt_assign_var (struct wordsplit *wsp, const char *name, size_t namelen,
for (; j > 1; j--) for (; j > 1; j--)
free (newenv[j-1]); free (newenv[j-1]);
free (newenv[j-1]); free (newenv[j-1]);
free (newenv);
return _wsplt_nomem (wsp); return _wsplt_nomem (wsp);
} }
} }
@@ -1357,7 +1358,10 @@ expvar (struct wordsplit *wsp, const char *str, size_t len,
if (flg & _WSNF_QUOTE) if (flg & _WSNF_QUOTE)
{ {
if (wsnode_new (wsp, &newnode)) if (wsnode_new (wsp, &newnode))
return 1; {
free (value);
return 1;
}
wsnode_insert (wsp, newnode, *ptail, 0); wsnode_insert (wsp, newnode, *ptail, 0);
*ptail = newnode; *ptail = newnode;
newnode->flags = _WSNF_WORD | _WSNF_NOEXPAND | flg; newnode->flags = _WSNF_WORD | _WSNF_NOEXPAND | flg;
@@ -1777,8 +1781,6 @@ static int
wordsplit_pathexpand (struct wordsplit *wsp) wordsplit_pathexpand (struct wordsplit *wsp)
{ {
struct wordsplit_node *p, *next; struct wordsplit_node *p, *next;
char *pattern = NULL;
size_t patsize = 0;
size_t slen; size_t slen;
int flags = 0; int flags = 0;
@@ -1804,21 +1806,18 @@ wordsplit_pathexpand (struct wordsplit *wsp)
int i; int i;
glob_t g; glob_t g;
struct wordsplit_node *prev; struct wordsplit_node *prev;
char *pattern;
if (slen + 1 > patsize) pattern = malloc (slen + 1);
{ if (!pattern)
char *p = realloc (pattern, slen + 1); return _wsplt_nomem (wsp);
if (!p)
return _wsplt_nomem (wsp);
pattern = p;
patsize = slen + 1;
}
memcpy (pattern, str, slen); memcpy (pattern, str, slen);
pattern[slen] = 0; pattern[slen] = 0;
switch (glob (pattern, flags, NULL, &g)) switch (glob (pattern, flags, NULL, &g))
{ {
case 0: case 0:
free (pattern);
break; break;
case GLOB_NOSPACE: case GLOB_NOSPACE:
@@ -1845,6 +1844,7 @@ wordsplit_pathexpand (struct wordsplit *wsp)
else else
return _wsplt_seterr (wsp, WRDSE_USERERR); return _wsplt_seterr (wsp, WRDSE_USERERR);
} }
free (pattern);
continue; continue;
default: default:
@@ -1862,7 +1862,10 @@ wordsplit_pathexpand (struct wordsplit *wsp)
return 1; return 1;
newstr = strdup (g.gl_pathv[i]); newstr = strdup (g.gl_pathv[i]);
if (!newstr) if (!newstr)
return _wsplt_nomem (wsp); {
wsnode_free (newnode);
return _wsplt_nomem (wsp);
}
newnode->v.word = newstr; newnode->v.word = newstr;
newnode->flags |= _WSNF_WORD|_WSNF_QUOTE; newnode->flags |= _WSNF_WORD|_WSNF_QUOTE;
wsnode_insert (wsp, newnode, prev, 0); wsnode_insert (wsp, newnode, prev, 0);
@@ -1874,7 +1877,6 @@ wordsplit_pathexpand (struct wordsplit *wsp)
wsnode_free (p); wsnode_free (p);
} }
} }
free (pattern);
return 0; return 0;
} }