2
0
mirror of https://github.com/sudo-project/sudo.git synced 2025-09-04 00:05:11 +00:00

prevent a double free() when re-initing the parser

This commit is contained in:
Todd C. Miller
2007-09-01 12:45:11 +00:00
parent a7bfc59097
commit cbe6be8f8f

11
gram.y
View File

@@ -592,7 +592,7 @@ init_parser(path, quiet)
int quiet; int quiet;
{ {
struct defaults *d; struct defaults *d;
struct member *m, *lastbinding; struct member *m, *freed;
struct userspec *us; struct userspec *us;
struct privilege *priv; struct privilege *priv;
struct cmndspec *cs; struct cmndspec *cs;
@@ -607,11 +607,15 @@ init_parser(path, quiet)
efree(m->name); efree(m->name);
efree(m); efree(m);
} }
freed = NULL;
while ((cs = lh_pop(&priv->cmndlist)) != NULL) { while ((cs = lh_pop(&priv->cmndlist)) != NULL) {
if (lh_last(&cs->runaslist) != freed) {
freed = lh_last(&cs->runaslist);
while ((m = lh_pop(&cs->runaslist)) != NULL) { while ((m = lh_pop(&cs->runaslist)) != NULL) {
efree(m->name); efree(m->name);
efree(m); efree(m);
} }
}
efree(cs->cmnd->name); efree(cs->cmnd->name);
efree(cs->cmnd); efree(cs->cmnd);
efree(cs); efree(cs);
@@ -621,9 +625,10 @@ init_parser(path, quiet)
} }
lh_init(&userspecs); lh_init(&userspecs);
lastbinding = NULL; freed = NULL;
while ((d = lh_pop(&defaults)) != NULL) { while ((d = lh_pop(&defaults)) != NULL) {
if (lh_pop(&d->binding) != lastbinding) { if (lh_last(&d->binding) != freed) {
freed = lh_last(&d->binding);
while ((m = lh_pop(&d->binding)) != NULL) { while ((m = lh_pop(&d->binding)) != NULL) {
efree(m->name); efree(m->name);
efree(m); efree(m);