Skip to content

Commit

Permalink
ospfd: Fixing infinite loop when listing OSPF interfaces
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
RodrigoMNardi committed Oct 10, 2023
1 parent d2324b7 commit e0dbeff
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions ospfd/ospfd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -1273,22 +1274,26 @@ 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;

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);

return 1;
}


/* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
* there might not be any 'router ospf' config.
*
Expand Down

0 comments on commit e0dbeff

Please sign in to comment.