memory leak in variable.c: fcn vareval(), free variable v created by cp_enqvar and used locally

This commit is contained in:
h_vogt 2016-03-29 20:23:46 +02:00 committed by rlar
parent 58149203eb
commit f911d38e36
1 changed files with 7 additions and 4 deletions

View File

@ -740,7 +740,7 @@ cp_variablesubst(wordlist *wlist)
wordlist *
vareval(char *string)
{
struct variable *v;
struct variable *v, *vfree = NULL;
wordlist *wl;
char buf[BSIZE_SP], *s;
char *oldstring = copy(string);
@ -782,9 +782,10 @@ vareval(char *string)
if (eq(v->va_name, string))
break;
if (!v)
v = cp_enqvar(string);
vfree = v = cp_enqvar(string);
wl = wl_cons(copy(v ? "1" : "0"), NULL);
tfree(oldstring);
free_struct_variable(vfree);
return (wl);
case '#':
@ -793,7 +794,7 @@ vareval(char *string)
if (eq(v->va_name, string))
break;
if (!v)
v = cp_enqvar(string);
vfree = v = cp_enqvar(string);
if (!v) {
fprintf(cp_err, "Error: %s: no such variable.\n", string);
tfree(oldstring);
@ -806,6 +807,7 @@ vareval(char *string)
i = (v->va_type != CP_BOOL);
wl = wl_cons(tprintf("%d", i), NULL);
tfree(oldstring);
free_struct_variable(vfree);
return (wl);
case '\0':
@ -830,7 +832,7 @@ vareval(char *string)
if (!v) {
range = NULL;
string = oldstring;
v = cp_enqvar(string);
vfree = v = cp_enqvar(string);
}
if (!v && (s = getenv(string)) != NULL) {
wl = wl_cons(copy(s), NULL);
@ -843,6 +845,7 @@ vareval(char *string)
return (NULL);
}
wl = cp_varwl(v);
free_struct_variable(vfree);
/* Now parse and deal with 'range' ... */
if (range) {