From: Rodrigo Nardi Date: Mon, 18 Sep 2023 20:40:35 +0000 (-0300) Subject: ospfd: Fixing infinite loop when listing OSPF interfaces X-Git-Tag: base_10.0~370^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=refs%2Fpull%2F14437%2Fhead;p=mirror%2Ffrr.git ospfd: Fixing infinite loop when listing OSPF interfaces The problem was happening because the ospf->oiflist has this behaviour, each interface was removed and added at the end of the list in each ospf_network_run_subnet call, generation an infinite loop. As a solution, a copy of the list was generated and we interacted with a fixed list. Signed-off-by: Rodrigo Nardi --- diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c index e3ed4f2f34..9ed1d301f5 100644 --- a/ospfd/ospfd.c +++ b/ospfd/ospfd.c @@ -1257,8 +1257,9 @@ int ospf_network_unset(struct ospf *ospf, struct prefix_ipv4 *p, { struct route_node *rn; struct ospf_network *network; - struct listnode *node, *nnode; + struct listnode *node; struct ospf_interface *oi; + struct list *ospf_oiflist = NULL; rn = route_node_lookup(ospf->networks, (struct prefix *)p); if (rn == NULL) @@ -1273,8 +1274,9 @@ int ospf_network_unset(struct ospf *ospf, struct prefix_ipv4 *p, rn->info = NULL; route_unlock_node(rn); /* initial reference */ - /* Find interfaces that are not configured already. */ - for (ALL_LIST_ELEMENTS(ospf->oiflist, node, nnode, oi)) { + ospf_oiflist = list_dup(ospf->oiflist); + /* Find interfaces that are not configured already. */ + for (ALL_LIST_ELEMENTS_RO(ospf_oiflist, node, oi)) { if (oi->type == OSPF_IFTYPE_VIRTUALLINK) continue; @@ -1282,6 +1284,8 @@ int ospf_network_unset(struct ospf *ospf, struct prefix_ipv4 *p, ospf_network_run_subnet(ospf, oi->connected, NULL, NULL); } + list_delete(&ospf_oiflist); + /* Update connected redistribute. */ update_redistributed(ospf, 0); /* interfaces possibly removed */ ospf_area_check_free(ospf, area_id); @@ -1289,6 +1293,7 @@ int ospf_network_unset(struct ospf *ospf, struct prefix_ipv4 *p, return 1; } + /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means * there might not be any 'router ospf' config. *