]> git.puffer.fish Git - mirror/frr.git/commitdiff
ospfd: Fixing infinite loop when listing OSPF interfaces 14437/head
authorRodrigo Nardi <rnardi@netdef.org>
Mon, 18 Sep 2023 20:40:35 +0000 (17:40 -0300)
committerRodrigo Nardi <rnardi@netdef.org>
Tue, 10 Oct 2023 18:39:59 +0000 (15:39 -0300)
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 <rnardi@netdef.org>
ospfd/ospfd.c

index e3ed4f2f346d33fb996074727b448d32ca587e62..9ed1d301f50a8ca90f2ca36895a392c39b988fb7 100644 (file)
@@ -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.
  *