ospfd: Fix various route_unlock discrepencies
* ospf_ase.c: (ospf_ase_calculate_route) Fix compiler warning about eval
needing brackets.
(various) add defensive asserts.
* ospf_lsdb.c: (ospf_lsdb_add) add missing node unlock if same lsa already
was indexed.
(ospf_lsdb_delete) check it's actually the same as specified lsa before
deleting
(ospf_lsdb_lookup_by_id_next) fix another corner case - no result =>
don't go on.
diff --git a/ospfd/ospf_lsdb.c b/ospfd/ospf_lsdb.c
index c906f05..ea9a352 100644
--- a/ospfd/ospf_lsdb.c
+++ b/ospfd/ospf_lsdb.c
@@ -120,7 +120,10 @@
/* nothing to do? */
if (rn->info && rn->info == lsa)
- return;
+ {
+ route_unlock_node (rn);
+ return;
+ }
/* purge old entry? */
if (rn->info)
@@ -162,12 +165,13 @@
return;
}
+ assert (lsa->data->type < OSPF_MAX_LSA);
table = lsdb->type[lsa->data->type].db;
lsdb_prefix_set (&lp, lsa);
- rn = route_node_lookup (table, (struct prefix *) &lp);
- if (rn && (rn->info == lsa))
+ if ((rn = route_node_lookup (table, (struct prefix *) &lp)))
{
- ospf_lsdb_delete_entry (lsdb, rn);
+ if (rn->info == lsa)
+ ospf_lsdb_delete_entry (lsdb, rn);
route_unlock_node (rn); /* route_node_lookup */
}
}
@@ -274,7 +278,8 @@
rn = route_top (table);
else
{
- rn = route_node_get (table, (struct prefix *) &lp);
+ if ((rn = route_node_lookup (table, (struct prefix *) &lp)) == NULL)
+ return NULL;
rn = route_next (rn);
}