bgp_node_lookup() increases `lock` which is not decreased on return.
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
&& (struct bgp_path_info *)pi->extra->parent == parent_pi)
break;
- if (!pi)
+ if (!pi) {
+ bgp_dest_unlock_node(dest);
return 0;
+ }
if (bgp_debug_zebra(NULL))
zlog_debug("... delete dest %p (l %d) pi %p (l %d, f 0x%x)",
&& (struct bgp_path_info *)pi->extra->parent == parent_pi)
break;
- if (!pi)
+ if (!pi) {
+ bgp_dest_unlock_node(dest);
return 0;
+ }
/* Mark entry for deletion */
bgp_path_info_delete(dest, pi);
} else {
/* Re-instate the current remote best path if any */
dest = bgp_node_lookup(vpn->route_table, (struct prefix *)&p);
- if (dest)
+ if (dest) {
evpn_zebra_reinstall_best_route(bgp, vpn, dest);
+ bgp_dest_unlock_node(dest);
+ }
}
return 0;
parent_pi)
break;
- if (!pi)
+ if (!pi) {
+ bgp_dest_unlock_node(dest);
return 0;
+ }
/* Mark entry for deletion */
bgp_path_info_delete(dest, pi);
if (!dest || !bgp_dest_has_bgp_path_info_data(dest)) {
if (!json)
vty_out(vty, "%% Network not in table\n");
+
+ if (dest)
+ bgp_dest_unlock_node(dest);
+
return;
}
vty_out(vty, "\nDisplayed %u paths for requested prefix\n",
path_cnt);
}
+
+ bgp_dest_unlock_node(dest);
}
/*
if (!dest || !bgp_dest_has_bgp_path_info_data(dest)) {
if (!json)
vty_out(vty, "%% Network not in table\n");
+
+ if (dest)
+ bgp_dest_unlock_node(dest);
+
return;
}
vty_out(vty, "\nDisplayed %u paths for requested prefix\n",
path_cnt);
}
+
+ bgp_dest_unlock_node(dest);
}
/* Disaplay EVPN routes for a ESI - VTY handler */
if (!dest || !bgp_dest_has_bgp_path_info_data(dest)) {
if (!json)
vty_out(vty, "%% Network not in table\n");
+
+ if (dest)
+ bgp_dest_unlock_node(dest);
+
return;
}
vty_out(vty, "\nDisplayed %u paths for requested prefix\n",
path_cnt);
}
+
+ bgp_dest_unlock_node(dest);
}
/*
return;
table = bgp_dest_get_bgp_table_info(rd_dest);
- if (table == NULL)
+ if (table == NULL) {
+ bgp_dest_unlock_node(rd_dest);
return;
+ }
if (json) {
json_rd = json_object_new_object();
json_object_string_add(json_rd, "rd", rd_str);
}
+ bgp_dest_unlock_node(rd_dest);
+
/* Display all prefixes with this RD. */
for (dest = bgp_table_top(table); dest; dest = bgp_route_next(dest)) {
const struct prefix_evpn *evp =
json_rd = NULL;
}
}
+
+ bgp_dest_unlock_node(dest);
}
if (json) {
bgp_set_valid_label(&dest->local_label);
}
SET_FLAG(dest->flags, BGP_NODE_LABEL_CHANGED);
- bgp_dest_unlock_node(dest);
bgp_process(bgp, dest, afi, safi);
+ bgp_dest_unlock_node(dest);
return 1;
}
dest = bgp_node_lookup(bgp->rib[AFI_IP][SAFI_UNICAST],
(struct prefix *)addr);
if (dest) {
- bgp_dest_unlock_node(dest);
-
for (path = bgp_dest_get_bgp_path_info(dest); path;
path = path->next)
if (sockunion_same(&path->peer->su, &su))
return path;
+
+ bgp_dest_unlock_node(dest);
}
} else {
offset = name + v->namelen;
/* If default route is present in the local RIB, advertise the
* route
*/
- if (dest != NULL) {
+ if (dest) {
for (pi = bgp_dest_get_bgp_path_info(dest); pi;
pi = pi->next) {
if (CHECK_FLAG(pi->flags, BGP_PATH_SELECTED))
dest, subgrp, &attr,
pi);
}
+ bgp_dest_unlock_node(dest);
}
} else {
if (!CHECK_FLAG(subgrp->sflags,
* clear adj_out for the 0.0.0.0/0 prefix in the BGP
* table.
*/
- if (dest != NULL) {
+ if (dest) {
/* Remove the adjacency for the previously
* advertised default route
*/
/* Free allocated information. */
adj_free(adj);
}
+ bgp_dest_unlock_node(dest);
}
/* Advertise the default route */
if (!dest)
return -1;
- bgp_dest_unlock_node(dest);
-
switch (note) {
case ZAPI_ROUTE_INSTALLED:
new_select = NULL;
flog_err(EC_BGP_INVALID_ROUTE,
"selected route %pRN not found",
dest);
+
+ bgp_dest_unlock_node(dest);
return -1;
}
}
__func__, dest);
break;
}
+
+ bgp_dest_unlock_node(dest);
return 0;
}