]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: Delete the entire access-list only if there are no more entries
authorDonatas Abraitis <donatas.abraitis@gmail.com>
Mon, 27 Apr 2020 09:13:48 +0000 (12:13 +0300)
committerDonatas Abraitis <donatas.abraitis@gmail.com>
Mon, 27 Apr 2020 09:13:48 +0000 (12:13 +0300)
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 <donatas.abraitis@gmail.com>
lib/filter.c

index 17ca4689f4ac0f420781db711d6e76aad35ea385..4a83b8b04327d4c7188181e9429348239b97e524 100644 (file)
@@ -451,6 +451,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;
 
@@ -472,7 +473,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);
 }