From f822435cf52d6548e1c4b1adad37de4d9d024061 Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Mon, 27 Apr 2020 12:13:48 +0300 Subject: [PATCH] lib: Delete the entire access-list only if there are no more entries When you enter the access-list with the same sequence number but with a different prefix AND access-list has only a single entry, then the entry is deleted and the whole access-list is deleted. That means that "replace entry" never be re-inserted. With fix: ``` ~# vtysh -c 'c' -c 'access-list 1 seq 10 permit 127.0.0.10/32' ~# vtysh -c 'sh run' | grep access-list access-list 1 seq 10 permit 127.0.0.10/32 ~# vtysh -c 'c' -c 'access-list 1 seq 10 permit 127.0.0.20/32' ~# vtysh -c 'sh run' | grep access-list access-list 1 seq 10 permit 127.0.0.20/32 ~# vtysh -c 'c' -c 'access-list 1 seq 11 permit 127.0.0.11/32' ~# vtysh -c 'sh run' | grep access-list access-list 1 seq 10 permit 127.0.0.20/32 access-list 1 seq 11 permit 127.0.0.11/32 ~# vtysh -c 'c' -c 'no access-list 1 seq 10 permit 127.0.0.20/32' ~# vtysh -c 'sh run' | grep access-list access-list 1 seq 11 permit 127.0.0.11/32 ~# ``` Signed-off-by: Donatas Abraitis --- lib/filter.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/filter.c b/lib/filter.c index 67f49775ba..5fcc9e51ab 100644 --- a/lib/filter.c +++ b/lib/filter.c @@ -455,6 +455,7 @@ static void access_list_filter_delete(struct access_list *access, struct filter *filter) { struct access_master *master; + struct filter *replace = filter; master = access->master; @@ -476,7 +477,7 @@ static void access_list_filter_delete(struct access_list *access, (*master->delete_hook)(access); /* If access_list becomes empty delete it from access_master. */ - if (access_list_empty(access)) + if (access_list_empty(access) && !replace) access_list_delete(access); } -- 2.39.5