From 8c4796a22d196d37a94ed497eaf5dbcd1f3a93de Mon Sep 17 00:00:00 2001 From: Igor Ryzhov Date: Wed, 14 Apr 2021 13:08:18 +0300 Subject: [PATCH] lib: fix access-list deletion Problems with the current implementation: * Delete hook is called before the deletion of the access-list from the master list, which means that daemons processing this hook successfully find this access-list, store a pointer to it in their structures, and right after that the access-list is freed. Daemons end up having stale pointer to the freed structure. * Route-maps are not notified of the deletion. This commit fixes both issues. Signed-off-by: Igor Ryzhov --- lib/filter.c | 5 +++++ lib/filter_nb.c | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/filter.c b/lib/filter.c index ab62e95fb6..ba8a3086af 100644 --- a/lib/filter.c +++ b/lib/filter.c @@ -181,6 +181,11 @@ void access_list_delete(struct access_list *access) else list->head = access->next; + route_map_notify_dependencies(access->name, RMAP_EVENT_FILTER_DELETED); + + if (master->delete_hook) + master->delete_hook(access); + XFREE(MTYPE_ACCESS_LIST_STR, access->name); XFREE(MTYPE_TMP, access->remark); diff --git a/lib/filter_nb.c b/lib/filter_nb.c index 08c29789b9..85805ffa47 100644 --- a/lib/filter_nb.c +++ b/lib/filter_nb.c @@ -508,17 +508,12 @@ static int lib_access_list_create(struct nb_cb_create_args *args) static int lib_access_list_destroy(struct nb_cb_destroy_args *args) { - struct access_master *am; struct access_list *acl; if (args->event != NB_EV_APPLY) return NB_OK; acl = nb_running_unset_entry(args->dnode); - am = acl->master; - if (am->delete_hook) - am->delete_hook(acl); - access_list_delete(acl); return NB_OK; -- 2.39.5