]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
Release scopes during cleanup
authorPatrick McHardy <kaber@trash.net>
Fri, 20 Mar 2009 15:23:50 +0000 (16:23 +0100)
committerPatrick McHardy <kaber@trash.net>
Fri, 20 Mar 2009 15:23:50 +0000 (16:23 +0100)
Properly release the user-defined symbols.

Signed-off-by: Patrick McHardy <kaber@trash.net>
include/rule.h
src/main.c
src/rule.c

index 4e5da06408c37caad017df471ba005aa1abd3d73..01eeb2102a89faa529cadfcee5a88c729f14c66d 100644 (file)
@@ -35,6 +35,7 @@ struct scope {
 };
 
 extern struct scope *scope_init(struct scope *scope, const struct scope *parent);
+extern void scope_release(const struct scope *scope);
 
 /**
  * struct symbol
index f7686ae3e91518a7006834fd479d75eefbd3e487..00f594f669d0ff7639ea776618498a9764d73cb5 100644 (file)
@@ -195,6 +195,7 @@ int main(int argc, char * const *argv)
        }
 out:
        scanner_destroy(scanner);
+       scope_release(&state.top_scope);
        erec_print_list(stdout, &msgs);
 
        xfree(buf);
index 8efbd887b4db919a7328c06b65e9c30dcb411545..6f322b8b09b33e7366a961b6d74170b5b8910afc 100644 (file)
@@ -75,6 +75,18 @@ struct scope *scope_init(struct scope *scope, const struct scope *parent)
        return scope;
 }
 
+void scope_release(const struct scope *scope)
+{
+       struct symbol *sym, *next;
+
+       list_for_each_entry_safe(sym, next, &scope->symbols, list) {
+               list_del(&sym->list);
+               xfree(sym->identifier);
+               expr_free(sym->expr);
+               xfree(sym);
+       }
+}
+
 void symbol_bind(struct scope *scope, const char *identifier, struct expr *expr)
 {
        struct symbol *sym;
@@ -118,6 +130,7 @@ void chain_free(struct chain *chain)
        list_for_each_entry_safe(rule, next, &chain->rules, list)
                rule_free(rule);
        handle_free(&chain->handle);
+       scope_release(&chain->scope);
        xfree(chain);
 }
 
@@ -165,6 +178,7 @@ void table_free(struct table *table)
        list_for_each_entry_safe(chain, next, &table->chains, list)
                chain_free(chain);
        handle_free(&table->handle);
+       scope_release(&table->scope);
        xfree(table);
 }