/* Delete VNI from hash list for this RT. */
listnode_delete(irt->vnis, vpn);
if (!listnode_head(irt->vnis)) {
- list_free(irt->vnis);
+ list_delete_and_null(&irt->vnis);
import_rt_free(bgp, irt);
}
}
if (red) {
listnode_delete(bgp->redist[afi][type], red);
XFREE(MTYPE_BGP_REDIST, red);
- if (!bgp->redist[afi][type]->count) {
- list_free(bgp->redist[afi][type]);
- bgp->redist[afi][type] = NULL;
- }
+ if (!bgp->redist[afi][type]->count)
+ list_delete_and_null(&bgp->redist[afi][type]);
}
}
/* reverse bgp_master_init */
bgp_close();
if (bm->listen_sockets)
- list_free(bm->listen_sockets);
- bm->listen_sockets = NULL;
+ list_delete_and_null(&bm->listen_sockets);
for (ALL_LIST_ELEMENTS(bm->bgp, mnode, mnnode, bgp))
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer))
if (nve_list) {
vnc_direct_bgp_unexport_table(
afi, it->imported_vpn[afi], nve_list);
- list_free(nve_list);
+ list_delete_and_null(&nve_list);
}
}
}
static void eigrp_prefix_entry_del(struct eigrp_prefix_entry *node)
{
- list_delete_all_node(node->entries);
- list_free(node->entries);
+ list_delete_and_null(&node->entries);
}
/*
*/
void eigrp_topology_free(struct list *list)
{
- list_free(list);
+ list_delete_and_null(&list);
}
/*
listnode_delete(eigrp->topology_changes_internalIPV4, node);
if (listnode_lookup(topology, node) != NULL) {
- list_delete_all_node(node->entries);
- list_free(node->entries);
- list_free(node->rij);
+ list_delete_and_null(&node->entries);
+ list_delete_and_null(&node->rij);
listnode_delete(topology, node);
eigrp_zebra_route_delete(node->destination);
XFREE(MTYPE_EIGRP_PREFIX_ENTRY, node);
if_delete_retain(ifp);
- list_free(ifp->connected);
- list_free(ifp->nbr_connected);
+ list_delete_and_null(&ifp->connected);
+ list_delete_and_null(&ifp->nbr_connected);
if_link_params_free(ifp);
}
/* Free list. */
-void list_free(struct list *l)
+static void list_free_internal(struct list *l)
{
XFREE(MTYPE_LINK_LIST, l);
}
{
assert(*list);
list_delete_all_node(*list);
- list_free(*list);
+ list_free_internal(*list);
*list = NULL;
}
/* Prototypes. */
extern struct list *
list_new(void); /* encouraged: set list.del callback on new lists */
-extern void list_free(struct list *);
extern void listnode_add(struct list *, void *);
extern void listnode_add_sort(struct list *, void *);
/*
* The usage of list_delete is being transitioned to pass in
* the double pointer to remove use after free's.
+ * list_free usage is deprecated, it leads to memory leaks
+ * of the linklist nodes. Please use list_delete_and_null
+ *
* In Oct of 2018, rename list_delete_and_null to list_delete
* and remove list_delete_original and the list_delete #define
+ * Additionally remove list_free entirely
*/
#if CONFDATE > 20181001
CPP_NOTICE("list_delete without double pointer is deprecated, please fixup")
#endif
extern void list_delete_and_null(struct list **);
extern void list_delete_original(struct list *);
-#define list_delete(X) list_delete_original((X)) \
+#define list_delete(X) list_delete_original((X)) \
CPP_WARN("Please transition to using list_delete_and_null")
+#define list_free(X) list_delete_original((X)) \
+ CPP_WARN("Please transition tousing list_delete_and_null")
extern void list_delete_all_node(struct list *);
{
listnode_delete(masters, m);
if (masters->count == 0) {
- list_free(masters);
- masters = NULL;
+ list_delete_and_null(&masters);
}
}
pthread_mutex_unlock(&masters_mtx);
XFREE(MTYPE_REDIST_INST, id);
if (!red->instances->count) {
red->enabled = 0;
- list_free(red->instances);
- red->instances = NULL;
+ list_delete_and_null(&red->instances);
}
}
/* If none is found -- look through all. */
if (listcount(chosen) == 0) {
- list_free(chosen);
+ list_delete_and_null(&chosen);
chosen = rn->info;
}
route_table_finish(oi->ls_upd_queue);
/* Free any lists that should be freed */
- list_free(oi->nbr_nbma);
+ list_delete_and_null(&oi->nbr_nbma);
- list_free(oi->ls_ack);
- list_free(oi->ls_ack_direct.ls_ack);
+ list_delete_and_null(&oi->ls_ack);
+ list_delete_and_null(&oi->ls_ack_direct.ls_ack);
if (IS_DEBUG_OSPF_EVENT)
zlog_debug("%s: ospf interface %s vrf %s id %u deleted",
ospf->lsa_refresh_queue.qs[lsa->refresh_list];
listnode_delete(refresh_list, lsa);
if (!listcount(refresh_list)) {
- list_free(refresh_list);
+ list_delete_and_null(&refresh_list);
ospf->lsa_refresh_queue.qs[lsa->refresh_list] = NULL;
}
ospf_lsa_unlock(&lsa); /* lsa_refresh_queue */
lsa->refresh_list = -1;
listnode_add(lsa_to_refresh, lsa);
}
- list_free(refresh_list);
+ list_delete_and_null(&refresh_list);
}
}
list_delete_and_null(&ls_upd);
} else
- list_free(ls_upd);
+ list_delete_and_null(&ls_upd);
}
/* Get the list of LSAs from Link State Update packet.
listnode_delete(om->external[type], ext);
if (!om->external[type]->count) {
- list_free(om->external[type]);
- om->external[type] = NULL;
+ list_delete_and_null(&om->external[type]);
}
XFREE(MTYPE_OSPF_EXTERNAL, ext);
}
if (red) {
listnode_delete(ospf->redist[type], red);
if (!ospf->redist[type]->count) {
- list_free(ospf->redist[type]);
- ospf->redist[type] = NULL;
+ list_delete_and_null(&ospf->redist[type]);
}
ospf_routemap_unset(red);
XFREE(MTYPE_OSPF_REDISTRIBUTE, red);
/* Unlock route_node. */
listnode_delete(rp->info, rinfo);
if (list_isempty((struct list *)rp->info)) {
- list_free(rp->info);
- rp->info = NULL;
+ list_delete_and_null((struct list **)&rp->info);
route_unlock_node(rp);
}
/* Unlock route_node. */
listnode_delete(rp->info, rinfo);
if (list_isempty((struct list *)rp->info)) {
- list_free(rp->info);
- rp->info = NULL;
+ list_delete_and_null((struct list **)&rp->info);
route_unlock_node(rp);
}
}
if (list_isempty(list)) {
- list_free(list);
+ list_delete_and_null(&list);
rp->info = NULL;
route_unlock_node(rp);
}
struct rtadvconf *rtadv;
rtadv = &zebra_if->rtadv;
- list_free(rtadv->AdvPrefixList);
+ list_delete_and_null(&rtadv->AdvPrefixList);
#endif /* HAVE_RTADV */
XFREE(MTYPE_TMP, zebra_if);
}
/* Otherwise, free list and route node. */
- list_free(addr_list);
+ list_delete_and_null(&addr_list);
rn->info = NULL;
route_unlock_node(rn);
*/
static int fec_del(zebra_fec_t *fec)
{
- list_free(fec->client_list);
+ list_delete_and_null(&fec->client_list);
fec->rn->info = NULL;
route_unlock_node(fec->rn);
XFREE(MTYPE_FEC, fec);
void zebra_free_rnh(struct rnh *rnh)
{
rnh->flags |= ZEBRA_NHT_DELETED;
- list_free(rnh->client_list);
- list_free(rnh->zebra_static_route_list);
- list_free(rnh->zebra_pseudowire_list);
+ list_delete_and_null(&rnh->client_list);
+ list_delete_and_null(&rnh->zebra_static_route_list);
+ list_delete_and_null(&rnh->zebra_pseudowire_list);
free_state(rnh->vrf_id, rnh->state, rnh->node);
XFREE(MTYPE_RNH, rnh);
}