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