list_for_each_entry_safe(batch_page, next, &batch_page_list, head) {
list_del(&batch_page->head);
- free(batch_page->batch);
+ free(mnl_nlmsg_batch_head(batch_page->batch));
+ mnl_nlmsg_batch_stop(batch_page->batch);
free(batch_page);
batch_num_pages--;
}
int nft_xtables_config_load(struct nft_handle *h, const char *filename,
uint32_t flags)
{
- struct nftnl_table_list *table_list = nftnl_table_list_alloc();
- struct nftnl_chain_list *chain_list = nftnl_chain_list_alloc();
+ struct nftnl_table_list *table_list = NULL;
+ struct nftnl_chain_list *chain_list = NULL;
struct nftnl_table_list_iter *titer = NULL;
struct nftnl_chain_list_iter *citer = NULL;
struct nftnl_table *table;
if (h->restore)
return 0;
+ table_list = nftnl_table_list_alloc();
+ chain_list = nftnl_chain_list_alloc();
+
if (xtables_config_parse(filename, table_list, chain_list) < 0) {
if (errno == ENOENT) {
xtables_config_perror(flags,
/* This chain has been found, delete from list. Later
* on, unvisited chains will be purged out.
*/
- if (chain_obj != NULL)
+ if (chain_obj != NULL) {
nftnl_chain_list_del(chain_obj);
+ nftnl_chain_free(chain_obj);
+ }
}
struct nft_xt_restore_cb restore_cb = {
xt_params->program_name, line + 1);
exit(1);
}
+
+ if (chain_list)
+ nftnl_chain_list_free(chain_list);
}
static int
xtables_restore_parse(&h, &p, &restore_cb, argc, argv);
+ nft_fini(&h);
fclose(p.in);
return 0;
}