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 4d64117e79
commit 13b6a5fd40
1 changed files with 7 additions and 4 deletions

View File

@ -713,7 +713,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);
@ -755,9 +755,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 '#':
@ -766,7 +767,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);
@ -779,6 +780,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':
@ -803,7 +805,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);
@ -816,6 +818,7 @@ vareval(char *string)
return (NULL);
}
wl = cp_varwl(v);
free_struct_variable(vfree);
/* Now parse and deal with 'range' ... */
if (range) {