]> git.proxmox.com Git - mirror_frr.git/commitdiff
*: Convert list_delete(struct list *) to ** to allow nulling
authorDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 5 Oct 2017 14:51:01 +0000 (10:51 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 5 Oct 2017 14:53:13 +0000 (10:53 -0400)
Convert the list_delete(struct list *) function to use
struct list **.  This is to allow the list pointer to be nulled.

I keep running into uses of this list_delete function where we
forget to set the returned pointer to NULL and attempt to use
it and then experience a crash, usually after the developer
has long since left the building.

Let's make the api explicit in it setting the list pointer
to null.

Cynical Prediction:  This code will expose a attempt
to use the NULL'ed list pointer in some obscure bit
of code.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
80 files changed:
bgpd/bgp_evpn.c
bgpd/bgp_main.c
bgpd/bgpd.c
bgpd/rfapi/bgp_rfapi_cfg.c
bgpd/rfapi/rfapi.c
bgpd/rfapi/rfapi_rib.c
bgpd/rfapi/rfapi_vty.c
bgpd/rfapi/vnc_import_bgp.c
bgpd/rfapi/vnc_zebra.c
eigrpd/eigrp_dump.c
eigrpd/eigrp_fsm.c
eigrpd/eigrp_interface.c
eigrpd/eigrp_topology.c
eigrpd/eigrp_update.c
eigrpd/eigrpd.c
isisd/isis_circuit.c
isisd/isis_dr.c
isisd/isis_events.c
isisd/isis_lsp.c
isisd/isis_mt.c
isisd/isis_pdu.c
isisd/isis_route.c
isisd/isis_spf.c
isisd/isis_tlvs.c
isisd/isisd.c
lib/command.c
lib/command_match.c
lib/grammar_sandbox.c
lib/hash.c
lib/if.c
lib/keychain.c
lib/linklist.c
lib/linklist.h
lib/thread.c
lib/wheel.c
ospf6d/ospf6_area.c
ospf6d/ospf6_interface.c
ospf6d/ospf6_route.c
ospf6d/ospf6_spf.c
ospf6d/ospf6_top.c
ospfd/ospf_apiserver.c
ospfd/ospf_ase.c
ospfd/ospf_interface.c
ospfd/ospf_ism.c
ospfd/ospf_lsa.c
ospfd/ospf_opaque.c
ospfd/ospf_packet.c
ospfd/ospf_ri.c
ospfd/ospf_route.c
ospfd/ospf_spf.c
ospfd/ospf_te.c
ospfd/ospfd.c
pimd/pim_hello.c
pimd/pim_iface.c
pimd/pim_ifchannel.c
pimd/pim_igmp.c
pimd/pim_instance.c
pimd/pim_jp_agg.c
pimd/pim_msdp.c
pimd/pim_neighbor.c
pimd/pim_nht.c
pimd/pim_oil.c
pimd/pim_rp.c
pimd/pim_ssmpingd.c
pimd/pim_tlv.c
pimd/pim_upstream.c
ripd/rip_offset.c
ripd/ripd.c
ripngd/ripng_nexthop.c
ripngd/ripng_offset.c
ripngd/ripngd.c
tests/isisd/test_fuzz_isis_tlv.c
vtysh/vtysh_config.c
zebra/interface.c
zebra/irdp_interface.c
zebra/label_manager.c
zebra/main.c
zebra/zebra_mpls.c
zebra/zebra_rib.c
zebra/zebra_vxlan.c

index 6923479cb2eafc577fb6dea5f7e4dadcd3e959d5..f5c0fd60103be8821dc6e689f05918219334bb87 100644 (file)
@@ -2609,10 +2609,8 @@ void bgp_evpn_free(struct bgp *bgp, struct bgpevpn *vpn)
 {
        bgp_table_unlock(vpn->route_table);
        bgp_evpn_unmap_vni_from_its_rts(bgp, vpn);
-       list_delete(vpn->import_rtl);
-       list_delete(vpn->export_rtl);
-       vpn->import_rtl = NULL;
-       vpn->export_rtl = NULL;
+       list_delete_and_null(&vpn->import_rtl);
+       list_delete_and_null(&vpn->export_rtl);
        bf_release_index(bgp->rd_idspace, vpn->rd_id);
        hash_release(bgp->vnihash, vpn);
        QOBJ_UNREG(vpn);
index dfd639c92c70d9dd1193d0d878067ba9928362de..1fac2936eb7d2e5ca25305fa66c5dcecded48863 100644 (file)
@@ -215,7 +215,7 @@ static __attribute__((__noreturn__)) void bgp_exit(int status)
 #endif
        bgp_zebra_destroy();
 
-       list_delete(bm->bgp);
+       list_delete_and_null(&bm->bgp);
        memset(bm, 0, sizeof(*bm));
 
        frr_fini();
index 54155290d6412d7fc17b4e71bc270dabe395453f..28f0b14d397eedf7f786c78233d15ce498e07d27 100644 (file)
@@ -2436,14 +2436,14 @@ int peer_group_delete(struct peer_group *group)
                        peer_delete(other);
                }
        }
-       list_delete(group->peer);
+       list_delete_and_null(&group->peer);
 
        for (afi = AFI_IP; afi < AFI_MAX; afi++) {
                for (ALL_LIST_ELEMENTS(group->listen_range[afi], node, nnode,
                                       prefix)) {
                        prefix_free(prefix);
                }
-               list_delete(group->listen_range[afi]);
+               list_delete_and_null(&group->listen_range[afi]);
        }
 
        XFREE(MTYPE_PEER_GROUP_HOST, group->name);
@@ -3193,8 +3193,8 @@ void bgp_free(struct bgp *bgp)
 
        QOBJ_UNREG(bgp);
 
-       list_delete(bgp->group);
-       list_delete(bgp->peer);
+       list_delete_and_null(&bgp->group);
+       list_delete_and_null(&bgp->peer);
 
        if (bgp->peerhash) {
                hash_free(bgp->peerhash);
index 3dffb59d118eeac8975114c634f432fe313b21cb..5ae27a2878f310e33e37ba21b3b89daa92a972dc 100644 (file)
@@ -2327,8 +2327,7 @@ static void bgp_rfapi_delete_nve_group(struct vty *vty, /* NULL = no output */
                        listnode_delete(rfg->nves, rfd);
                        listnode_add(orphaned_nves, rfd);
                }
-               list_delete(rfg->nves);
-               rfg->nves = NULL;
+               list_delete_and_null(&rfg->nves);
        }
 
        /* delete it */
@@ -2405,7 +2404,7 @@ static void bgp_rfapi_delete_nve_group(struct vty *vty, /* NULL = no output */
                        if (vty)
                                vty_out(vty, "\n");
                }
-               list_delete(orphaned_nves);
+               list_delete_and_null(&orphaned_nves);
        }
 }
 
@@ -3420,7 +3419,7 @@ static void bgp_rfapi_delete_l2_group(struct vty *vty, /* NULL = no output */
        if (rfg->rt_export_list)
                ecommunity_free(&rfg->rt_export_list);
        if (rfg->labels)
-               list_delete(rfg->labels);
+               list_delete_and_null(&rfg->labels);
        if (rfg->rfp_cfg)
                XFREE(MTYPE_RFAPI_RFP_GROUP_CFG, rfg->rfp_cfg);
        listnode_delete(bgp->rfapi_cfg->l2_groups, rfg);
@@ -3825,10 +3824,10 @@ void bgp_rfapi_cfg_destroy(struct bgp *bgp, struct rfapi_cfg *h)
        bgp_rfapi_delete_named_nve_group(NULL, bgp, NULL, RFAPI_GROUP_CFG_MAX);
        bgp_rfapi_delete_named_l2_group(NULL, bgp, NULL);
        if (h->l2_groups != NULL)
-               list_delete(h->l2_groups);
-       list_delete(h->nve_groups_sequential);
-       list_delete(h->rfg_export_direct_bgp_l);
-       list_delete(h->rfg_export_zebra_l);
+               list_delete_and_null(&h->l2_groups);
+       list_delete_and_null(&h->nve_groups_sequential);
+       list_delete_and_null(&h->rfg_export_direct_bgp_l);
+       list_delete_and_null(&h->rfg_export_zebra_l);
        if (h->default_rt_export_list)
                ecommunity_free(&h->default_rt_export_list);
        if (h->default_rt_import_list)
index 477716cafbc4f67647e1aef443bed9e50785d2c4..6e31b6345178b6ed0c5efaf4a9c0f495ed5731f7 100644 (file)
@@ -490,7 +490,8 @@ void del_vnc_route(struct rfapi_descriptor *rfd,
                 * Delete local_nexthops list
                 */
                if (bi->extra && bi->extra->vnc.export.local_nexthops) {
-                       list_delete(bi->extra->vnc.export.local_nexthops);
+                       list_delete_and_null(
+                               &bi->extra->vnc.export.local_nexthops);
                }
 
                bgp_aggregate_decrement(bgp, p, bi, afi, safi);
index 748c0c476b1d41ecca8de66e8c449b25592952c2..92cd1888ee267dee5b8c83da586cd4a8f5680fb4 100644 (file)
@@ -510,13 +510,12 @@ void rfapiRibClear(struct rfapi_descriptor *rfd)
                                 */
                                if (pn->info) {
                                        if (pn->info != (void *)1) {
-                                               list_delete(
-                                                       (struct list
-                                                                *)(pn->info));
+                                               list_delete_and_null(
+                                                       (struct list **)(&pn->info));
                                        }
                                        pn->info = NULL;
-                                       route_unlock_node(
-                                               pn); /* linklist or 1 deleted */
+                                       /* linklist or 1 deleted */
+                                       route_unlock_node(pn);
                                }
                        }
                }
@@ -1435,7 +1434,7 @@ callback:
                }
 
                delete_list->del = (void (*)(void *))rfapi_info_free;
-               list_delete(delete_list);
+               list_delete_and_null(&delete_list);
        }
 
        RFAPI_RIB_CHECK_COUNTS(0, 0);
@@ -1450,7 +1449,7 @@ callback:
                route_unlock_node(pn);
        }
        if (lPendCost) {
-               list_delete(lPendCost);
+               list_delete_and_null(&lPendCost);
                pn->info = NULL;
                route_unlock_node(pn);
        }
@@ -1634,7 +1633,7 @@ void rfapiRibUpdatePendingNode(
         */
        if (pn->info) {
                if (pn->info != (void *)1) {
-                       list_delete((struct list *)(pn->info));
+                       list_delete_and_null((struct list **)(&pn->info));
                }
                pn->info = NULL;
                route_unlock_node(pn); /* linklist or 1 deleted */
index c6958237a38f7c4d70116c7adf1250fe482b2a32..7bfc8882e2dcc44665949251fc4b675285f63030 100644 (file)
@@ -3274,7 +3274,7 @@ static int rfapiDeleteLocalPrefixesByRFD(struct rfapi_local_reg_delete_arg *cda,
                                }
                                list_delete_all_node(adb_delete_list);
                        }
-                       list_delete(adb_delete_list);
+                       list_delete_and_null(&adb_delete_list);
                }
 
 
index 117d4fbfd4de27e766e69040a7f0d06092e3dccb..4122ae5a9f657492122bb97cef2ff117c65dc88c 100644 (file)
@@ -2426,7 +2426,7 @@ void vnc_import_bgp_exterior_add_route_interior(
                        skiplist_delete(it->monitor_exterior_orphans,
                                        bi_exterior, NULL);
                }
-               list_delete(list_adopted);
+               list_delete_and_null(&list_adopted);
        }
 }
 
index 3fc6ddfe35c27f75dcf1e8c81319fb889cf2c28f..b8058cf1e5eff4a3a33c113aee13bb69840ba488 100644 (file)
@@ -584,7 +584,7 @@ static void vnc_zebra_add_del_prefix(struct bgp *bgp,
                nve_list_to_nh_array(rn->p.family, nves, &nexthop_count,
                                     &nh_ary, &nhp_ary);
 
-               list_delete(nves);
+               list_delete_and_null(&nves);
 
                if (nexthop_count)
                        vnc_zebra_route_msg(&rn->p, nexthop_count, nhp_ary,
@@ -753,7 +753,7 @@ static void vnc_zebra_add_del_group_afi(struct bgp *bgp,
                vnc_zlog_debug_verbose("%s: family: %d, nve count: %d",
                                       __func__, family, nexthop_count);
 
-               list_delete(nves);
+               list_delete_and_null(&nves);
 
                if (nexthop_count) {
                        /*
index ec143d7729c7e1aa4b03fe27e934e64fd6c94609..20656ec4ebe960d41e6a2fbbed5694e35fdfb5eb 100644 (file)
@@ -301,7 +301,7 @@ void show_ip_eigrp_prefix_entry(struct vty *vty, struct eigrp_prefix_entry *tn)
                tn->serno);
 
        if (successors)
-               list_delete(successors);
+               list_delete_and_null(&successors);
 }
 
 void show_ip_eigrp_nexthop_entry(struct vty *vty, struct eigrp *eigrp,
index 4514e5b9a8e26b45a905f8380fc6df96312afdb0..29357c2b248ee07bb94a8ac6cabf91b62ac0bcaa 100644 (file)
@@ -366,7 +366,7 @@ int eigrp_fsm_event_nq_fcn(struct eigrp_fsm_action_message *msg)
                                         // neighbors left
        }
 
-       list_delete(successors);
+       list_delete_and_null(&successors);
 
        return 1;
 }
@@ -393,7 +393,7 @@ int eigrp_fsm_event_q_fcn(struct eigrp_fsm_action_message *msg)
                                         // neighbors left
        }
 
-       list_delete(successors);
+       list_delete_and_null(&successors);
 
        return 1;
 }
@@ -445,7 +445,7 @@ int eigrp_fsm_event_lr(struct eigrp_fsm_action_message *msg)
                ne = listnode_head(successors);
                eigrp_send_reply(ne->adv_router,
                                 prefix);
-               list_delete(successors);
+               list_delete_and_null(&successors);
        }
 
        prefix->state = EIGRP_FSM_STATE_PASSIVE;
@@ -475,7 +475,7 @@ int eigrp_fsm_event_dinc(struct eigrp_fsm_action_message *msg)
                        msg);
 
 
-       list_delete(successors);
+       list_delete_and_null(&successors);
        return 1;
 }
 
@@ -500,7 +500,7 @@ int eigrp_fsm_event_lr_fcs(struct eigrp_fsm_action_message *msg)
                eigrp_send_reply(ne->adv_router,
                                 prefix);
 
-               list_delete(successors);
+               list_delete_and_null(&successors);
        }
        prefix->req_action |= EIGRP_FSM_NEED_UPDATE;
        listnode_add(eigrp->topology_changes_internalIPV4, prefix);
@@ -536,7 +536,7 @@ int eigrp_fsm_event_lr_fcn(struct eigrp_fsm_action_message *msg)
                                         // neighbors left
        }
 
-       list_delete(successors);
+       list_delete_and_null(&successors);
 
        return 1;
 }
@@ -552,6 +552,6 @@ int eigrp_fsm_event_qact(struct eigrp_fsm_action_message *msg)
        msg->prefix->state = EIGRP_FSM_STATE_ACTIVE_2;
        msg->prefix->distance = ne->distance;
 
-       list_delete(successors);
+       list_delete_and_null(&successors);
        return 1;
 }
index b8f7cf0441607d0e0ddc8b812bb6423c3fbfd36d..ec29d86fd248450a09a497a5e9486d82b41bcb2a 100644 (file)
@@ -109,7 +109,7 @@ int eigrp_if_delete_hook(struct interface *ifp)
        if (!ei)
                return 0;
 
-       list_delete(ei->nbrs);
+       list_delete_and_null(&ei->nbrs);
 
        eigrp = ei->eigrp;
        listnode_delete(eigrp->eiflist, ei);
@@ -354,7 +354,7 @@ void eigrp_if_free(struct eigrp_interface *ei,
 
        eigrp_if_down(ei);
 
-       list_delete(ei->nbrs);
+       list_delete_and_null(&ei->nbrs);
        listnode_delete(ei->eigrp->eiflist, ei);
 }
 
index f1bc83af63bc16aeb31cca92b91390feb8c33e1c..e8532a077c83ed76c4d26fd9559f1d1be29baee2 100644 (file)
@@ -199,7 +199,7 @@ void eigrp_nexthop_entry_add(struct eigrp_prefix_entry *node,
                eigrp_zebra_route_add(node->destination, l);
        }
 
-       list_delete(l);
+       list_delete_and_null(&l);
 }
 
 /*
@@ -296,7 +296,7 @@ struct list *eigrp_topology_get_successor(struct eigrp_prefix_entry *table_node)
         * If we have no successors return NULL
         */
        if (!successors->count) {
-               list_delete(successors);
+               list_delete_and_null(&successors);
                successors = NULL;
        }
 
@@ -475,7 +475,7 @@ void eigrp_update_routing_table(struct eigrp_prefix_entry *prefix)
                for (ALL_LIST_ELEMENTS_RO(successors, node, entry))
                        entry->flags |= EIGRP_NEXTHOP_ENTRY_INTABLE_FLAG;
 
-               list_delete(successors);
+               list_delete_and_null(&successors);
        } else {
                eigrp_zebra_route_delete(prefix->destination);
                for (ALL_LIST_ELEMENTS_RO(prefix->entries, node, entry))
index 125a230e7402cf171b1364efcfc8081a001b97e6..4a86b489445eece31b209f4ec530f6a331c97626 100644 (file)
@@ -411,7 +411,7 @@ void eigrp_update_receive(struct eigrp *eigrp, struct ip *iph,
        eigrp_update_send_all(eigrp, ei);
 
        if (nbr_prefixes)
-               list_delete(nbr_prefixes);
+               list_delete_and_null(&nbr_prefixes);
 }
 
 /*send EIGRP Update packet*/
index ee60898f866d929b80314d781f172a3b03aafd0b..c70e198bdb627abd14f65f2531f4a3d8f0f018f9 100644 (file)
@@ -282,10 +282,10 @@ void eigrp_finish_final(struct eigrp *eigrp)
        THREAD_OFF(eigrp->t_read);
        close(eigrp->fd);
 
-       list_delete(eigrp->eiflist);
-       list_delete(eigrp->oi_write_q);
-       list_delete(eigrp->topology_changes_externalIPV4);
-       list_delete(eigrp->topology_changes_internalIPV4);
+       list_delete_and_null(&eigrp->eiflist);
+       list_delete_and_null(&eigrp->oi_write_q);
+       list_delete_and_null(&eigrp->topology_changes_externalIPV4);
+       list_delete_and_null(&eigrp->topology_changes_internalIPV4);
 
        eigrp_topology_cleanup(eigrp->topology_table);
        eigrp_topology_free(eigrp->topology_table);
index 1c1385ab77a4c72640b617a8a59870ed8a9a4a0e..4179de1c01c9805be87bfe1598627331e788f8b4 100644 (file)
@@ -453,19 +453,19 @@ void isis_circuit_if_del(struct isis_circuit *circuit, struct interface *ifp)
 
        if (circuit->ip_addrs) {
                assert(listcount(circuit->ip_addrs) == 0);
-               list_delete(circuit->ip_addrs);
+               list_delete_and_null(&circuit->ip_addrs);
                circuit->ip_addrs = NULL;
        }
 
        if (circuit->ipv6_link) {
                assert(listcount(circuit->ipv6_link) == 0);
-               list_delete(circuit->ipv6_link);
+               list_delete_and_null(&circuit->ipv6_link);
                circuit->ipv6_link = NULL;
        }
 
        if (circuit->ipv6_non_link) {
                assert(listcount(circuit->ipv6_non_link) == 0);
-               list_delete(circuit->ipv6_non_link);
+               list_delete_and_null(&circuit->ipv6_non_link);
                circuit->ipv6_non_link = NULL;
        }
 
@@ -692,22 +692,22 @@ void isis_circuit_down(struct isis_circuit *circuit)
        if (circuit->circ_type == CIRCUIT_T_BROADCAST) {
                /* destroy neighbour lists */
                if (circuit->u.bc.lan_neighs[0]) {
-                       list_delete(circuit->u.bc.lan_neighs[0]);
+                       list_delete_and_null(&circuit->u.bc.lan_neighs[0]);
                        circuit->u.bc.lan_neighs[0] = NULL;
                }
                if (circuit->u.bc.lan_neighs[1]) {
-                       list_delete(circuit->u.bc.lan_neighs[1]);
+                       list_delete_and_null(&circuit->u.bc.lan_neighs[1]);
                        circuit->u.bc.lan_neighs[1] = NULL;
                }
                /* destroy adjacency databases */
                if (circuit->u.bc.adjdb[0]) {
                        circuit->u.bc.adjdb[0]->del = isis_delete_adj;
-                       list_delete(circuit->u.bc.adjdb[0]);
+                       list_delete_and_null(&circuit->u.bc.adjdb[0]);
                        circuit->u.bc.adjdb[0] = NULL;
                }
                if (circuit->u.bc.adjdb[1]) {
                        circuit->u.bc.adjdb[1]->del = isis_delete_adj;
-                       list_delete(circuit->u.bc.adjdb[1]);
+                       list_delete_and_null(&circuit->u.bc.adjdb[1]);
                        circuit->u.bc.adjdb[1] = NULL;
                }
                if (circuit->u.bc.is_dr[0]) {
@@ -745,8 +745,7 @@ void isis_circuit_down(struct isis_circuit *circuit)
        THREAD_OFF(circuit->t_read);
 
        if (circuit->lsp_queue) {
-               list_delete(circuit->lsp_queue);
-               circuit->lsp_queue = NULL;
+               list_delete_and_null(&circuit->lsp_queue);
        }
 
        if (circuit->lsp_hash) {
index 2db82719156373ccf048098571648b3fc8977141..84b0bb973925014de2d8d74a4cdaba6e1f436637 100644 (file)
@@ -135,7 +135,7 @@ int isis_dr_elect(struct isis_circuit *circuit, int level)
 
        if (!adjdb) {
                zlog_warn("isis_dr_elect() adjdb == NULL");
-               list_delete(list);
+               list_delete_and_null(&list);
                return ISIS_WARNING;
        }
        isis_adj_build_up_list(adjdb, list);
@@ -177,7 +177,7 @@ int isis_dr_elect(struct isis_circuit *circuit, int level)
                 */
                if (circuit->u.bc.is_dr[level - 1])
                        retval = isis_dr_resign(circuit, level);
-               list_delete(list);
+               list_delete_and_null(&list);
                return retval;
        }
 
@@ -217,7 +217,7 @@ int isis_dr_elect(struct isis_circuit *circuit, int level)
                if (circuit->u.bc.is_dr[level - 1])
                        retval = isis_dr_resign(circuit, level);
        }
-       list_delete(list);
+       list_delete_and_null(&list);
        return retval;
 }
 
index 1cc90d031c80874f205ba03d648c38117e8e8829..bc35439926d103ede65987cc4419c292ec40c498 100644 (file)
@@ -132,10 +132,8 @@ static void circuit_resign_level(struct isis_circuit *circuit, int level)
                THREAD_TIMER_OFF(circuit->u.bc.t_refresh_pseudo_lsp[idx]);
                circuit->lsp_regenerate_pending[idx] = 0;
                circuit->u.bc.run_dr_elect[idx] = 0;
-               if (circuit->u.bc.lan_neighs[idx] != NULL) {
-                       list_delete(circuit->u.bc.lan_neighs[idx]);
-                       circuit->u.bc.lan_neighs[idx] = NULL;
-               }
+               if (circuit->u.bc.lan_neighs[idx] != NULL)
+                       list_delete_and_null(&circuit->u.bc.lan_neighs[idx]);
        }
 
        return;
index bee6abfdab9c182b837ec7eedfb6216c2805a8ea..07579446aacfa70ad774f36db05d82fca75bdd45 100644 (file)
@@ -126,7 +126,7 @@ static void lsp_destroy(struct isis_lsp *lsp)
        lsp_clear_data(lsp);
 
        if (LSP_FRAGMENT(lsp->hdr.lsp_id) == 0 && lsp->lspu.frags) {
-               list_delete(lsp->lspu.frags);
+               list_delete_and_null(&lsp->lspu.frags);
                lsp->lspu.frags = NULL;
        }
 
@@ -1143,7 +1143,7 @@ static void lsp_build(struct isis_lsp *lsp, struct isis_area *area)
                frag->tlvs = tlvs;
        }
 
-       list_delete(fragments);
+       list_delete_and_null(&fragments);
        lsp_debug("ISIS (%s): LSP construction is complete. Serializing...",
                  area->area_tag);
        return;
@@ -1521,7 +1521,7 @@ static void lsp_build_pseudo(struct isis_lsp *lsp, struct isis_circuit *circuit,
                                LSP_PSEUDO_ID(ne_id));
                }
        }
-       list_delete(adj_list);
+       list_delete_and_null(&adj_list);
        return;
 }
 
@@ -1905,7 +1905,7 @@ int lsp_tick(struct thread *thread)
                }
        }
 
-       list_delete(lsp_list);
+       list_delete_and_null(&lsp_list);
 
        return ISIS_OK;
 }
index 52646c26245b03379e9e175b1f06a6bbd1ad1365..d13f2a13f314ddb15a9a05566b9e88cb5c3192a9 100644 (file)
@@ -151,8 +151,7 @@ void area_mt_init(struct isis_area *area)
 
 void area_mt_finish(struct isis_area *area)
 {
-       list_delete(area->mt_settings);
-       area->mt_settings = NULL;
+       list_delete_and_null(&area->mt_settings);
 }
 
 struct isis_area_mt_setting *area_get_mt_setting(struct isis_area *area,
@@ -275,8 +274,7 @@ void circuit_mt_init(struct isis_circuit *circuit)
 
 void circuit_mt_finish(struct isis_circuit *circuit)
 {
-       list_delete(circuit->mt_settings);
-       circuit->mt_settings = NULL;
+       list_delete_and_null(&circuit->mt_settings);
 }
 
 struct isis_circuit_mt_setting *
index 2f9e3caf1ccb8f3194d01172dbca57d00c38d18c..be989cbabb170db9c553970a897db8b98e0bbfbe 100644 (file)
@@ -1292,7 +1292,7 @@ static int process_snp(uint8_t pdu_type, struct isis_circuit *circuit,
                for (ALL_LIST_ELEMENTS_RO(lsp_list, node, lsp))
                        ISIS_SET_FLAG(lsp->SRMflags, circuit);
                /* lets free it */
-               list_delete(lsp_list);
+               list_delete_and_null(&lsp_list);
        }
 
        retval = ISIS_OK;
index ff17572ef9d1c34e7930dc67155da70ef8cf7dfa..b9605018ed506675f8569af1ef78dd507e50f14e 100644 (file)
@@ -289,13 +289,13 @@ static void isis_route_info_delete(struct isis_route_info *route_info)
        if (route_info->nexthops) {
                route_info->nexthops->del =
                        (void (*)(void *))isis_nexthop_delete;
-               list_delete(route_info->nexthops);
+               list_delete_and_null(&route_info->nexthops);
        }
 
        if (route_info->nexthops6) {
                route_info->nexthops6->del =
                        (void (*)(void *))isis_nexthop6_delete;
-               list_delete(route_info->nexthops6);
+               list_delete_and_null(&route_info->nexthops6);
        }
 
        XFREE(MTYPE_ISIS_ROUTE_INFO, route_info);
index cd9a0f89bbb4cb5592ac252abc81a48fb68bf397..3008fb6a1eb1805c3b3e7317381f2080a6efd12e 100644 (file)
@@ -205,10 +205,8 @@ static void isis_vertex_queue_free(struct isis_vertex_queue *queue)
        if (queue->insert_counter) {
                skiplist_free(queue->l.slist);
                queue->l.slist = NULL;
-       } else {
-               list_delete(queue->l.list);
-               queue->l.list = NULL;
-       }
+       } else
+               list_delete_and_null(&queue->l.list);
 }
 
 static unsigned int isis_vertex_queue_count(struct isis_vertex_queue *queue)
@@ -437,10 +435,8 @@ static struct isis_vertex *isis_vertex_new(void *id, enum vertextype vtype)
 
 static void isis_vertex_del(struct isis_vertex *vertex)
 {
-       list_delete(vertex->Adj_N);
-       vertex->Adj_N = NULL;
-       list_delete(vertex->parents);
-       vertex->parents = NULL;
+       list_delete_and_null(&vertex->Adj_N);
+       list_delete_and_null(&vertex->parents);
 
        memset(vertex, 0, sizeof(struct isis_vertex));
        XFREE(MTYPE_ISIS_VERTEX, vertex);
@@ -1038,7 +1034,7 @@ static int isis_spf_preload_tent(struct isis_spftree *spftree,
                        adjdb = circuit->u.bc.adjdb[spftree->level - 1];
                        isis_adj_build_up_list(adjdb, adj_list);
                        if (listcount(adj_list) == 0) {
-                               list_delete(adj_list);
+                               list_delete_and_null(&adj_list);
                                if (isis->debugs & DEBUG_SPF_EVENTS)
                                        zlog_debug(
                                                "ISIS-Spf: no L%d adjacencies on circuit %s",
@@ -1102,7 +1098,7 @@ static int isis_spf_preload_tent(struct isis_spftree *spftree,
                                                "isis_spf_preload_tent unknow adj type");
                                }
                        }
-                       list_delete(adj_list);
+                       list_delete_and_null(&adj_list);
                        /*
                         * Add the pseudonode
                         */
index 25a10e91e6d5960496906e6eabf8ecebb6f7cd66..b7389947b7c0140b8631d3d6640e659be1a69af1 100644 (file)
@@ -2397,8 +2397,7 @@ struct list *isis_fragment_tlvs(struct isis_tlvs *tlvs, size_t size)
                struct listnode *node;
                for (ALL_LIST_ELEMENTS_RO(rv, node, fragment_tlvs))
                        isis_free_tlvs(fragment_tlvs);
-               list_delete(rv);
-               rv = NULL;
+               list_delete_and_null(&rv);
        }
 
        stream_free(dummy_stream);
index bdc1d836db6bb89515589fa8e63ed7ceb08e3e76..5dd348089dac4e4fb193ba7b11f7a21ce6cd2594 100644 (file)
@@ -220,8 +220,7 @@ int isis_area_destroy(struct vty *vty, const char *area_tag)
                        circuit->ipv6_router = 0;
                        isis_csm_state_change(ISIS_DISABLE, circuit, area);
                }
-               list_delete(area->circuit_list);
-               area->circuit_list = NULL;
+               list_delete_and_null(&area->circuit_list);
        }
 
        if (area->lspdb[0] != NULL) {
index d1b086737280dfdfd8809fa13af09b5af5230aaa..97eba96c3a7f0a50edf71479b00838d8057336ad 100644 (file)
@@ -686,7 +686,7 @@ static vector cmd_complete_command_real(vector vline, struct vty *vty,
        }
 
        vector comps = completions_to_vec(completions);
-       list_delete(completions);
+       list_delete_and_null(&completions);
 
        // set status code appropriately
        switch (vector_active(comps)) {
@@ -1006,7 +1006,7 @@ static int cmd_execute_command_real(vector vline, enum filter_type filter,
        // if matcher error, return corresponding CMD_ERR
        if (MATCHER_ERROR(status)) {
                if (argv_list)
-                       list_delete(argv_list);
+                       list_delete_and_null(&argv_list);
                switch (status) {
                case MATCHER_INCOMPLETE:
                        return CMD_ERR_INCOMPLETE;
@@ -1035,7 +1035,7 @@ static int cmd_execute_command_real(vector vline, enum filter_type filter,
                ret = matched_element->func(matched_element, vty, argc, argv);
 
        // delete list and cmd_token's in it
-       list_delete(argv_list);
+       list_delete_and_null(&argv_list);
        XFREE(MTYPE_TMP, argv);
 
        return ret;
@@ -2730,6 +2730,6 @@ void cmd_terminate()
        if (host.config)
                XFREE(MTYPE_HOST, host.config);
 
-       list_delete(varhandlers);
+       list_delete_and_null(&varhandlers);
        qobj_finish();
 }
index 6384abe5ce838f424f0d40e2e5e7a934818bba7a..c60373f910abec5244698a944b04dc4797466631 100644 (file)
@@ -333,7 +333,7 @@ static enum matcher_rv command_match_r(struct graph_node *start, vector vline,
                status = MATCHER_INCOMPLETE;
 
        // cleanup
-       list_delete(next);
+       list_delete_and_null(&next);
 
        return status;
 }
@@ -366,7 +366,7 @@ enum matcher_rv command_complete(struct graph *graph, vector vline,
 
        unsigned int idx;
        for (idx = 0; idx < vector_active(vline) && next->count > 0; idx++) {
-               list_delete(current);
+               list_delete_and_null(&current);
                current = next;
                next = list_new();
                next->del = stack_del;
@@ -457,8 +457,8 @@ enum matcher_rv command_complete(struct graph *graph, vector vline,
                }
        }
 
-       list_delete(current);
-       list_delete(next);
+       list_delete_and_null(&current);
+       list_delete_and_null(&next);
 
        return mrv;
 }
@@ -648,7 +648,7 @@ static void del_arglist(struct list *list)
        list_delete_node(list, tail);
 
        // delete the rest of the list as usual
-       list_delete(list);
+       list_delete_and_null(&list);
 }
 
 /*---------- token level matching functions ----------*/
index 3c6396f3470494204b03f286eb1e1a2062105b97..66b042ad974c3a1183cfd62c638e450b08b551ac 100644 (file)
@@ -141,7 +141,7 @@ DEFUN (grammar_test_complete,
                vty_out(vty, "%% No match\n");
 
        // free resources
-       list_delete(completions);
+       list_delete_and_null(&completions);
        cmd_free_strvec(command);
        XFREE(MTYPE_TMP, cmdstr);
 
@@ -185,7 +185,7 @@ DEFUN (grammar_test_match,
 
                vty_out(vty, "func: %p\n", element->func);
 
-               list_delete(argvv);
+               list_delete_and_null(&argvv);
        } else {
                assert(MATCHER_ERROR(result));
                switch (result) {
@@ -426,7 +426,7 @@ DEFUN (grammar_findambig,
                        }
                        prev = cur;
                }
-               list_delete(commands);
+               list_delete_and_null(&commands);
 
                vty_out(vty, "\n");
        } while (scan && scannode < LINK_PARAMS_NODE);
index 243521bef7cc7201efda7a1b4bd06d3174eeae9d..d2846d7379bcf3f60c7dc2bfbd00e212536d3079 100644 (file)
@@ -318,8 +318,7 @@ void hash_free(struct hash *hash)
                if (_hashes) {
                        listnode_delete(_hashes, hash);
                        if (_hashes->count == 0) {
-                               list_delete(_hashes);
-                               _hashes = NULL;
+                               list_delete_and_null(&_hashes);
                        }
                }
        }
index 7d27229656e2ec22f0dc2c9c40c9fe7f7dce5591..ce5816fd22630129a68ea60db770a4c1da76a48c 100644 (file)
--- a/lib/if.c
+++ b/lib/if.c
@@ -1095,8 +1095,7 @@ void if_terminate(struct list **intf_list)
                if_delete(ifp);
        }
 
-       list_delete(*intf_list);
-       *intf_list = NULL;
+       list_delete_and_null(intf_list);
 }
 
 const char *if_link_type_str(enum zebra_link_type llt)
index f0108e0805eccad15637426f043c3d5c30b74c82..23a2d72b17a638097ecd66aa522f5f378141a1ec 100644 (file)
@@ -119,7 +119,7 @@ static void keychain_delete(struct keychain *keychain)
        if (keychain->name)
                XFREE(MTYPE_KEYCHAIN, keychain->name);
 
-       list_delete(keychain->key);
+       list_delete_and_null(&keychain->key);
        listnode_delete(keychain_list, keychain);
        keychain_free(keychain);
 }
index c1b056d7398dbc0fefa493e9fbac7f70d4555fbe..2f9e7c1e33db281b859459d329e1adbfb9d9c7ac 100644 (file)
@@ -239,7 +239,7 @@ void list_delete_all_node(struct list *list)
        assert(list);
        for (node = list->head; node; node = next) {
                next = node->next;
-               if (list->del)
+               if (*list->del)
                        (*list->del)(node->data);
                listnode_free(node);
        }
@@ -248,11 +248,17 @@ void list_delete_all_node(struct list *list)
 }
 
 /* Delete all listnode then free list itself. */
-void list_delete(struct list *list)
+void list_delete_and_null(struct list **list)
 {
-       assert(list);
-       list_delete_all_node(list);
-       list_free(list);
+       assert(*list);
+       list_delete_all_node(*list);
+       list_free(*list);
+       *list = NULL;
+}
+
+void list_delete_original(struct list *list)
+{
+       list_delete_and_null(&list);
 }
 
 /* Lookup the node which has given data. */
index 9bd6e384991b1b9310570f3f189b1e9a3e0727f7..5ae728ce0eb5f2645dde4002d845aa4692af9f13 100644 (file)
@@ -74,7 +74,20 @@ extern void listnode_delete(struct list *, void *);
 extern struct listnode *listnode_lookup(struct list *, void *);
 extern void *listnode_head(struct list *);
 
-extern void list_delete(struct list *);
+/*
+ * The usage of list_delete is being transitioned to pass in
+ * the double pointer to remove use after free's.
+ * In Oct of 2018, rename list_delete_and_null to list_delete
+ * and remove list_delete_original and the list_delete #define
+ */
+#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))  \
+       CPP_WARN("Please transition to using list_delete_and_null")
+
 extern void list_delete_all_node(struct list *);
 
 /* For ospfd and ospf6d. */
index a69bd2f0d57ed753532731e2646b7c1f143771ca..fce8dee1641d97a908fe050396c33087f9ac8abb 100644 (file)
@@ -570,7 +570,7 @@ void thread_master_free(struct thread_master *m)
        pthread_cond_destroy(&m->cancel_cond);
        close(m->io_pipe[0]);
        close(m->io_pipe[1]);
-       list_delete(m->cancel_req);
+       list_delete_and_null(&m->cancel_req);
        m->cancel_req = NULL;
 
        hash_clean(m->cpu_record, cpu_record_hash_free);
index 9f1f189b72665a9798d20fc90fb731b02b2fe165..b1a3e89fc74ed440391c77c609900c2733b666cb 100644 (file)
@@ -99,7 +99,7 @@ void wheel_delete(struct timer_wheel *wheel)
        int i;
 
        for (i = 0; i < wheel->slots; i++) {
-               list_delete(wheel->wheel_slot_lists[i]);
+               list_delete_and_null(&wheel->wheel_slot_lists[i]);
        }
 
        THREAD_OFF(wheel->timer);
index b5584dc86de19526a4c6f6f3acd26aec7f7fae5f..b1267862466b589882a75100f4fe136e6b953291 100644 (file)
@@ -272,7 +272,7 @@ void ospf6_area_delete(struct ospf6_area *oa)
        for (ALL_LIST_ELEMENTS_RO(oa->if_list, n, oi))
                oi->area = NULL;
 
-       list_delete(oa->if_list);
+       list_delete_and_null(&oa->if_list);
 
        ospf6_lsdb_delete(oa->lsdb);
        ospf6_lsdb_delete(oa->lsdb_self);
index 8e01cb43794309460b1acc91686603396e2e0b29..7286b3242d9ba377ea01fe160044e9743f1889b1 100644 (file)
@@ -242,7 +242,7 @@ void ospf6_interface_delete(struct ospf6_interface *oi)
        for (ALL_LIST_ELEMENTS(oi->neighbor_list, node, nnode, on))
                ospf6_neighbor_delete(on);
 
-       list_delete(oi->neighbor_list);
+       list_delete_and_null(&oi->neighbor_list);
 
        THREAD_OFF(oi->thread_send_hello);
        THREAD_OFF(oi->thread_send_lsupdate);
index 117d2eef89f6771a4f2338a092cbbb8c9636fee7..724258d2fe333b3910a6f6bbc420652149d4b902 100644 (file)
@@ -353,7 +353,7 @@ void ospf6_route_delete(struct ospf6_route *route)
 {
        if (route) {
                if (route->nh_list)
-                       list_delete(route->nh_list);
+                       list_delete_and_null(&route->nh_list);
                XFREE(MTYPE_OSPF6_ROUTE, route);
        }
 }
index ccfa25aaa83bc45261b967d0fd39773b582a97b1..2381318b274cb5f35b40c6ee70a07cf1e402534a 100644 (file)
@@ -152,8 +152,8 @@ static struct ospf6_vertex *ospf6_vertex_create(struct ospf6_lsa *lsa)
 
 static void ospf6_vertex_delete(struct ospf6_vertex *v)
 {
-       list_delete(v->nh_list);
-       list_delete(v->child_list);
+       list_delete_and_null(&v->nh_list);
+       list_delete_and_null(&v->child_list);
        XFREE(MTYPE_OSPF6_VERTEX, v);
 }
 
index 9794e92b06e8b280b0ed4f8d5804655842dd762f..b0281b9e0a6e00ca2a2e2bc92b8197817ec0b662 100644 (file)
@@ -172,7 +172,7 @@ void ospf6_delete(struct ospf6 *o)
                ospf6_area_delete(oa);
 
 
-       list_delete(o->area_list);
+       list_delete_and_null(&o->area_list);
 
        ospf6_lsdb_delete(o->lsdb);
        ospf6_lsdb_delete(o->lsdb_self);
index 252a5df0fdef44da505c2fc896355a6e9f8c1d20..c1485abb813870ded612ff61dbc5320dddf298f5 100644 (file)
@@ -180,7 +180,7 @@ void ospf_apiserver_term(void)
 
        /* Free client list itself */
        if (apiserver_list)
-               list_delete(apiserver_list);
+               list_delete_and_null(&apiserver_list);
 
        /* Free wildcard list */
        /* XXX  */
index 877e4b7fb0e8d2bd09ca48d2b797695aba81e728..1abb1a6a3f6a9b73477ea694739ec4eb3252cfc8 100644 (file)
@@ -98,7 +98,7 @@ struct ospf_route *ospf_find_asbr_route(struct ospf *ospf,
                }
 
        if (chosen != rn->info)
-               list_delete(chosen);
+               list_delete_and_null(&chosen);
 
        return best;
 }
@@ -761,7 +761,7 @@ void ospf_ase_external_lsas_finish(struct route_table *rt)
                if ((lst = rn->info) != NULL) {
                        for (ALL_LIST_ELEMENTS(lst, node, nnode, lsa))
                                ospf_lsa_unlock(&lsa); /* external_lsas lst */
-                       list_delete(lst);
+                       list_delete_and_null(&lst);
                }
 
        route_table_finish(rt);
index d8d7caa6888b5e04e0e9393164ad78ee95e131d1..b57f8a4d38f990ad22fcb2102595ee89505a52d1 100644 (file)
@@ -509,7 +509,7 @@ static struct ospf_if_params *ospf_new_if_params(void)
 
 void ospf_del_if_params(struct ospf_if_params *oip)
 {
-       list_delete(oip->auth_crypt);
+       list_delete_and_null(&oip->auth_crypt);
        bfd_info_free(&(oip->bfd_info));
        XFREE(MTYPE_OSPF_IF_PARAMS, oip);
 }
index f223a870dab704df49c25b51b8825d2cd5d2caa1..25ab9cbe0fd37cfb3f6d1f865c5aedf466ec731c 100644 (file)
@@ -104,7 +104,7 @@ static struct ospf_neighbor *ospf_elect_dr(struct ospf_interface *oi,
        else
                DR(oi).s_addr = 0;
 
-       list_delete(dr_list);
+       list_delete_and_null(&dr_list);
 
        return dr;
 }
@@ -144,8 +144,8 @@ static struct ospf_neighbor *ospf_elect_bdr(struct ospf_interface *oi,
        else
                BDR(oi).s_addr = 0;
 
-       list_delete(bdr_list);
-       list_delete(no_dr_list);
+       list_delete_and_null(&bdr_list);
+       list_delete_and_null(&no_dr_list);
 
        return bdr;
 }
@@ -232,7 +232,7 @@ static int ospf_dr_election(struct ospf_interface *oi)
                zlog_debug("DR-Election[2nd]: DR     %s", inet_ntoa(DR(oi)));
        }
 
-       list_delete(el_list);
+       list_delete_and_null(&el_list);
 
        /* if DR or BDR changes, cause AdjOK? neighbor event. */
        if (!IPV4_ADDR_SAME(&old_dr, &DR(oi))
index e5d4d3423108afbdfb290b9dd7016026395fa1bf..270021cab0e71d33fae4ae5572dd33a977e3163f 100644 (file)
@@ -3707,7 +3707,7 @@ int ospf_lsa_refresh_walker(struct thread *t)
                        &lsa); /* lsa_refresh_queue & temp for lsa_to_refresh*/
        }
 
-       list_delete(lsa_to_refresh);
+       list_delete_and_null(&lsa_to_refresh);
 
        if (IS_DEBUG_OSPF(lsa, LSA_REFRESH))
                zlog_debug("LSA[Refresh]: ospf_lsa_refresh_walker(): end");
index bc71e371b1c8b6166abc8c3854d4a30b7335ad7e..5a1f28b036be88f6f2bc37e17b8f55f36fb85585 100644 (file)
@@ -113,7 +113,7 @@ void ospf_opaque_term(void)
 int ospf_opaque_type9_lsa_init(struct ospf_interface *oi)
 {
        if (oi->opaque_lsa_self != NULL)
-               list_delete(oi->opaque_lsa_self);
+               list_delete_and_null(&oi->opaque_lsa_self);
 
        oi->opaque_lsa_self = list_new();
        oi->opaque_lsa_self->del = free_opaque_info_per_type;
@@ -125,7 +125,7 @@ void ospf_opaque_type9_lsa_term(struct ospf_interface *oi)
 {
        OSPF_TIMER_OFF(oi->t_opaque_lsa_self);
        if (oi->opaque_lsa_self != NULL)
-               list_delete(oi->opaque_lsa_self);
+               list_delete_and_null(&oi->opaque_lsa_self);
        oi->opaque_lsa_self = NULL;
        return;
 }
@@ -133,7 +133,7 @@ void ospf_opaque_type9_lsa_term(struct ospf_interface *oi)
 int ospf_opaque_type10_lsa_init(struct ospf_area *area)
 {
        if (area->opaque_lsa_self != NULL)
-               list_delete(area->opaque_lsa_self);
+               list_delete_and_null(&area->opaque_lsa_self);
 
        area->opaque_lsa_self = list_new();
        area->opaque_lsa_self->del = free_opaque_info_per_type;
@@ -154,15 +154,14 @@ void ospf_opaque_type10_lsa_term(struct ospf_area *area)
 
        OSPF_TIMER_OFF(area->t_opaque_lsa_self);
        if (area->opaque_lsa_self != NULL)
-               list_delete(area->opaque_lsa_self);
-       area->opaque_lsa_self = NULL;
+               list_delete_and_null(&area->opaque_lsa_self);
        return;
 }
 
 int ospf_opaque_type11_lsa_init(struct ospf *top)
 {
        if (top->opaque_lsa_self != NULL)
-               list_delete(top->opaque_lsa_self);
+               list_delete_and_null(&top->opaque_lsa_self);
 
        top->opaque_lsa_self = list_new();
        top->opaque_lsa_self->del = free_opaque_info_per_type;
@@ -183,8 +182,7 @@ void ospf_opaque_type11_lsa_term(struct ospf *top)
 
        OSPF_TIMER_OFF(top->t_opaque_lsa_self);
        if (top->opaque_lsa_self != NULL)
-               list_delete(top->opaque_lsa_self);
-       top->opaque_lsa_self = NULL;
+               list_delete_and_null(&top->opaque_lsa_self);
        return;
 }
 
@@ -287,16 +285,16 @@ static void ospf_opaque_funclist_term(void)
        struct list *funclist;
 
        funclist = ospf_opaque_wildcard_funclist;
-       list_delete(funclist);
+       list_delete_and_null(&funclist);
 
        funclist = ospf_opaque_type9_funclist;
-       list_delete(funclist);
+       list_delete_and_null(&funclist);
 
        funclist = ospf_opaque_type10_funclist;
-       list_delete(funclist);
+       list_delete_and_null(&funclist);
 
        funclist = ospf_opaque_type11_funclist;
-       list_delete(funclist);
+       list_delete_and_null(&funclist);
        return;
 }
 
@@ -616,7 +614,7 @@ static void free_opaque_info_per_type(void *val)
        }
 
        OSPF_TIMER_OFF(oipt->t_opaque_lsa_self);
-       list_delete(oipt->id_list);
+       list_delete_and_null(&oipt->id_list);
        XFREE(MTYPE_OPAQUE_INFO_PER_TYPE, oipt);
        return;
 }
index 015eac096ca4fb1dc24c46046343fe29e2ce6db6..36583a63eee49cb3641b775170478b3541361411 100644 (file)
@@ -519,7 +519,7 @@ int ospf_ls_upd_timer(struct thread *thread)
 
                if (listcount(update) > 0)
                        ospf_ls_upd_send(nbr, update, OSPF_SEND_PACKET_DIRECT);
-               list_delete(update);
+               list_delete_and_null(&update);
        }
 
        /* Set LS Update retransmission timer. */
@@ -1572,7 +1572,7 @@ static void ospf_ls_req(struct ip *iph, struct ospf_header *ospfh,
                /* Verify LSA type. */
                if (ls_type < OSPF_MIN_LSA || ls_type >= OSPF_MAX_LSA) {
                        OSPF_NSM_EVENT_SCHEDULE(nbr, NSM_BadLSReq);
-                       list_delete(ls_upd);
+                       list_delete_and_null(&ls_upd);
                        return;
                }
 
@@ -1581,7 +1581,7 @@ static void ospf_ls_req(struct ip *iph, struct ospf_header *ospfh,
                                       adv_router);
                if (find == NULL) {
                        OSPF_NSM_EVENT_SCHEDULE(nbr, NSM_BadLSReq);
-                       list_delete(ls_upd);
+                       list_delete_and_null(&ls_upd);
                        return;
                }
 
@@ -1615,7 +1615,7 @@ static void ospf_ls_req(struct ip *iph, struct ospf_header *ospfh,
                        ospf_ls_upd_send(nbr, ls_upd,
                                         OSPF_SEND_PACKET_INDIRECT);
 
-               list_delete(ls_upd);
+               list_delete_and_null(&ls_upd);
        } else
                list_free(ls_upd);
 }
@@ -1758,7 +1758,7 @@ static void ospf_upd_list_clean(struct list *lsas)
        for (ALL_LIST_ELEMENTS(lsas, node, nnode, lsa))
                ospf_lsa_discard(lsa);
 
-       list_delete(lsas);
+       list_delete_and_null(&lsas);
 }
 
 /* OSPF Link State Update message read -- RFC2328 Section 13. */
@@ -2159,7 +2159,7 @@ static void ospf_ls_upd(struct ospf *ospf, struct ip *iph,
 #undef DISCARD_LSA
 
        assert(listcount(lsas) == 0);
-       list_delete(lsas);
+       list_delete_and_null(&lsas);
 }
 
 /* OSPF Link State Acknowledgment message read -- RFC2328 Section 13.7. */
@@ -3774,7 +3774,7 @@ void ospf_ls_upd_send_lsa(struct ospf_neighbor *nbr, struct ospf_lsa *lsa,
        listnode_add(update, lsa);
        ospf_ls_upd_send(nbr, update, flag);
 
-       list_delete(update);
+       list_delete_and_null(&update);
 }
 
 /* Determine size for packet. Must be at least big enough to accomodate next
@@ -3918,8 +3918,7 @@ static int ospf_ls_upd_send_queue_event(struct thread *thread)
 
                /* list might not be empty. */
                if (listcount(update) == 0) {
-                       list_delete(rn->info);
-                       rn->info = NULL;
+                       list_delete_and_null((struct list **)&rn->info);
                        route_unlock_node(rn);
                } else
                        again = 1;
index f9e346b1d1f83e0a5dd99a262c9633ba3f26f3bc..d5769c866e3609f77faeb0f29ccfa6ad679eee96 100644 (file)
@@ -188,11 +188,9 @@ static int ospf_router_info_unregister()
 void ospf_router_info_term(void)
 {
 
-       list_delete(OspfRI.pce_info.pce_domain);
-       list_delete(OspfRI.pce_info.pce_neighbor);
+       list_delete_and_null(&OspfRI.pce_info.pce_domain);
+       list_delete_and_null(&OspfRI.pce_info.pce_neighbor);
 
-       OspfRI.pce_info.pce_domain = NULL;
-       OspfRI.pce_info.pce_neighbor = NULL;
        OspfRI.enabled = false;
 
        ospf_router_info_unregister();
index ca851ec75d25476c87d3181d2624126078f41f18..cc7c6d266600a897704f515da27216474f23806d 100644 (file)
@@ -54,7 +54,7 @@ struct ospf_route *ospf_route_new()
 void ospf_route_free(struct ospf_route * or)
 {
        if (or->paths)
-               list_delete(or->paths);
+               list_delete_and_null(&or->paths);
 
        XFREE(MTYPE_OSPF_ROUTE, or);
 }
@@ -902,7 +902,7 @@ void ospf_prune_unreachable_routers(struct route_table *rtrs)
                                zlog_debug("Pruning router node %s",
                                           inet_ntoa(rn->p.u.prefix4));
 
-                       list_delete(paths);
+                       list_delete_and_null(&paths);
                        rn->info = NULL;
                        route_unlock_node(rn);
                }
index 5e5742608921f91c46761e9fe25af5d87c46b88b..65437dba9e38dd3f70f7e86f0ff49c795e2ade82 100644 (file)
@@ -210,12 +210,10 @@ static void ospf_vertex_free(void *data)
        // assert (listcount (v->parents) == 0);
 
        if (v->children)
-               list_delete(v->children);
-       v->children = NULL;
+               list_delete_and_null(&v->children);
 
        if (v->parents)
-               list_delete(v->parents);
-       v->parents = NULL;
+               list_delete_and_null(&v->parents);
 
        v->lsa = NULL;
 
@@ -1089,7 +1087,7 @@ void ospf_rtrs_free(struct route_table *rtrs)
                        for (ALL_LIST_ELEMENTS(or_list, node, nnode, or))
                                ospf_route_free(or);
 
-                       list_delete(or_list);
+                       list_delete_and_null(&or_list);
 
                        /* Unlock the node. */
                        rn->info = NULL;
index 294ffe48b3c6b89ae0950ed1360eac60e8358741..5f300dabaec90bac42a30ec29227542166ec7984 100644 (file)
@@ -166,8 +166,7 @@ static int ospf_mpls_te_unregister()
 
 void ospf_mpls_te_term(void)
 {
-       list_delete(OspfMplsTE.iflist);
-       OspfMplsTE.iflist = NULL;
+       list_delete_and_null(&OspfMplsTE.iflist);
 
        ospf_delete_opaque_functab(OSPF_OPAQUE_AREA_LSA,
                                   OPAQUE_TYPE_TRAFFIC_ENGINEERING_LSA);
index 507c97d9793d7ac3461479e01c795285708afec8..24d3abf2a76160282d35e354bcb2bfa4944b03c8 100644 (file)
@@ -620,7 +620,7 @@ static void ospf_finish_final(struct ospf *ospf)
        for (ALL_LIST_ELEMENTS(ospf->vlinks, node, nnode, vl_data))
                ospf_vl_delete(ospf, vl_data);
 
-       list_delete(ospf->vlinks);
+       list_delete_and_null(&ospf->vlinks);
 
        /* Remove any ospf interface config params */
        for (ALL_LIST_ELEMENTS_RO(vrf_iflist(ospf->vrf_id), node, ifp)) {
@@ -734,9 +734,9 @@ static void ospf_finish_final(struct ospf *ospf)
                ospf_ase_external_lsas_finish(ospf->external_lsas);
        }
 
-       list_delete(ospf->areas);
-       list_delete(ospf->oi_write_q);
-       list_delete(ospf->oiflist);
+       list_delete_and_null(&ospf->areas);
+       list_delete_and_null(&ospf->oi_write_q);
+       list_delete_and_null(&ospf->oiflist);
 
        for (i = ZEBRA_ROUTE_SYSTEM; i <= ZEBRA_ROUTE_MAX; i++) {
                struct list *ext_list;
@@ -852,7 +852,7 @@ static void ospf_area_free(struct ospf_area *area)
        ospf_lsa_unlock(&area->router_lsa_self);
 
        route_table_finish(area->ranges);
-       list_delete(area->oiflist);
+       list_delete_and_null(&area->oiflist);
 
        if (EXPORT_NAME(area))
                free(EXPORT_NAME(area));
@@ -1276,7 +1276,7 @@ void ospf_ls_upd_queue_empty(struct ospf_interface *oi)
                if ((lst = (struct list *)rn->info)) {
                        for (ALL_LIST_ELEMENTS(lst, node, nnode, lsa))
                                ospf_lsa_unlock(&lsa); /* oi->ls_upd_queue */
-                       list_delete(lst);
+                       list_delete_and_null(&lst);
                        rn->info = NULL;
                }
 
index 138a110d3a67c87eeb112d78b9b61fdd3d5acb19..08a1432bb003651a8c97806fcc282d04ba482e50 100644 (file)
@@ -125,9 +125,9 @@ static void tlv_trace_list(const char *label, const char *tlv_name,
        }
 }
 
-#define FREE_ADDR_LIST                                                         \
-       if (hello_option_addr_list) {                                          \
-               list_delete(hello_option_addr_list);                           \
+#define FREE_ADDR_LIST                                                 \
+       if (hello_option_addr_list) {                                   \
+               list_delete_and_null(&hello_option_addr_list);          \
        }
 
 #define FREE_ADDR_LIST_THEN_RETURN(code)                                       \
index b8cbed7f93a5dff491471f2a220c61b57248ac93..8787145027a3ab2e85974d3c4a9533efab7eac79 100644 (file)
@@ -71,19 +71,19 @@ static void *if_list_clean(struct pim_interface *pim_ifp)
        struct pim_ifchannel *ch;
 
        if (pim_ifp->igmp_join_list)
-               list_delete(pim_ifp->igmp_join_list);
+               list_delete_and_null(&pim_ifp->igmp_join_list);
 
        if (pim_ifp->igmp_socket_list)
-               list_delete(pim_ifp->igmp_socket_list);
+               list_delete_and_null(&pim_ifp->igmp_socket_list);
 
        if (pim_ifp->pim_neighbor_list)
-               list_delete(pim_ifp->pim_neighbor_list);
+               list_delete_and_null(&pim_ifp->pim_neighbor_list);
 
        if (pim_ifp->upstream_switch_list)
-               list_delete(pim_ifp->upstream_switch_list);
+               list_delete_and_null(&pim_ifp->upstream_switch_list);
 
        if (pim_ifp->sec_addr_list)
-               list_delete(pim_ifp->sec_addr_list);
+               list_delete_and_null(&pim_ifp->sec_addr_list);
 
        while ((ch = RB_ROOT(pim_ifchannel_rb,
                             &pim_ifp->ifchannel_rb)) != NULL)
@@ -241,10 +241,10 @@ void pim_if_delete(struct interface *ifp)
 
        pim_if_del_vif(ifp);
 
-       list_delete(pim_ifp->igmp_socket_list);
-       list_delete(pim_ifp->pim_neighbor_list);
-       list_delete(pim_ifp->upstream_switch_list);
-       list_delete(pim_ifp->sec_addr_list);
+       list_delete_and_null(&pim_ifp->igmp_socket_list);
+       list_delete_and_null(&pim_ifp->pim_neighbor_list);
+       list_delete_and_null(&pim_ifp->upstream_switch_list);
+       list_delete_and_null(&pim_ifp->sec_addr_list);
 
        if (pim_ifp->boundary_oil_plist)
                XFREE(MTYPE_PIM_INTERFACE, pim_ifp->boundary_oil_plist);
@@ -1373,7 +1373,7 @@ int pim_if_igmp_join_del(struct interface *ifp, struct in_addr group_addr,
        listnode_delete(pim_ifp->igmp_join_list, ij);
        igmp_join_free(ij);
        if (listcount(pim_ifp->igmp_join_list) < 1) {
-               list_delete(pim_ifp->igmp_join_list);
+               list_delete_and_null(&pim_ifp->igmp_join_list);
                pim_ifp->igmp_join_list = 0;
        }
 
index bcf7d2318dd740be525c351d14d8e0cc01bf940e..6aa5105c5fefd028f6a82e2378d69b230698abe2 100644 (file)
@@ -169,7 +169,7 @@ void pim_ifchannel_delete(struct pim_ifchannel *ch)
        pim_ifchannel_remove_children(ch);
 
        if (ch->sources)
-               list_delete(ch->sources);
+               list_delete_and_null(&ch->sources);
 
        listnode_delete(ch->upstream->ifchannels, ch);
 
@@ -571,7 +571,7 @@ struct pim_ifchannel *pim_ifchannel_add(struct interface *ifp,
 
                pim_ifchannel_remove_children(ch);
                if (ch->sources)
-                       list_delete(ch->sources);
+                       list_delete_and_null(&ch->sources);
 
                THREAD_OFF(ch->t_ifjoin_expiry_timer);
                THREAD_OFF(ch->t_ifjoin_prune_pending_timer);
index f6c8db7acbad84d6cc4be47f9c11df740168fb0e..7524119e52ad92931e96ebf7cf23d22d9e65e16a 100644 (file)
@@ -696,7 +696,7 @@ void igmp_startup_mode_on(struct igmp_sock *igmp)
 
 static void igmp_group_free(struct igmp_group *group)
 {
-       list_delete(group->group_source_list);
+       list_delete_and_null(&group->group_source_list);
 
        XFREE(MTYPE_PIM_IGMP_GROUP, group);
 }
@@ -748,7 +748,7 @@ void igmp_sock_free(struct igmp_sock *igmp)
        zassert(igmp->igmp_group_list);
        zassert(!listcount(igmp->igmp_group_list));
 
-       list_delete(igmp->igmp_group_list);
+       list_delete_and_null(&igmp->igmp_group_list);
        hash_free(igmp->igmp_group_hash);
 
        XFREE(MTYPE_PIM_IGMP_SOCKET, igmp);
index 42feae3361c728b533c3980e9b7fce6832b0ca72..1fccbaeafa3be332a308d95837ae03eb9bcf2e09 100644 (file)
@@ -48,7 +48,7 @@ static void pim_instance_terminate(struct pim_instance *pim)
        }
 
        if (pim->static_routes)
-               list_delete(pim->static_routes);
+               list_delete_and_null(&pim->static_routes);
 
        pim_rp_free(pim);
 
index 8e0b4ab5e8ec0b27d328acbb53f45dfa0b7ca13f..7de3e4ca6cb54f9ccfa3592789bb26211fb96cbc 100644 (file)
@@ -32,7 +32,7 @@
 
 void pim_jp_agg_group_list_free(struct pim_jp_agg_group *jag)
 {
-       list_delete(jag->sources);
+       list_delete_and_null(&jag->sources);
 
        XFREE(MTYPE_PIM_JP_AGG_GROUP, jag);
 }
@@ -108,8 +108,7 @@ void pim_jp_agg_clear_group(struct list *group)
                        js->up = NULL;
                        XFREE(MTYPE_PIM_JP_AGG_SOURCE, js);
                }
-               list_delete(jag->sources);
-               jag->sources = NULL;
+               list_delete_and_null(&jag->sources);
                listnode_delete(group, jag);
                XFREE(MTYPE_PIM_JP_AGG_GROUP, jag);
        }
@@ -169,8 +168,7 @@ void pim_jp_agg_remove_group(struct list *group, struct pim_upstream *up)
        }
 
        if (jag->sources->count == 0) {
-               list_delete(jag->sources);
-               jag->sources = NULL;
+               list_delete_and_null(&jag->sources);
                listnode_delete(group, jag);
                XFREE(MTYPE_PIM_JP_AGG_GROUP, jag);
        }
index 4b049d90ad4bd07cc5b8daf7230371736d817edb..53a3382987272ce8cb23c3b376d0889a28616824 100644 (file)
@@ -1261,7 +1261,7 @@ static void pim_msdp_mg_free(struct pim_instance *pim, struct pim_msdp_mg *mg)
                XFREE(MTYPE_PIM_MSDP_MG_NAME, mg->mesh_group_name);
 
        if (mg->mbr_list)
-               list_delete(mg->mbr_list);
+               list_delete_and_null(&mg->mbr_list);
 
        XFREE(MTYPE_PIM_MSDP_MG, mg);
        pim->msdp.mg = NULL;
@@ -1619,8 +1619,7 @@ void pim_msdp_exit(struct pim_instance *pim)
        }
 
        if (pim->msdp.peer_list) {
-               list_delete(pim->msdp.peer_list);
-               pim->msdp.peer_list = NULL;
+               list_delete_and_null(&pim->msdp.peer_list);
        }
 
        if (pim->msdp.sa_hash) {
@@ -1629,7 +1628,6 @@ void pim_msdp_exit(struct pim_instance *pim)
        }
 
        if (pim->msdp.sa_list) {
-               list_delete(pim->msdp.sa_list);
-               pim->msdp.sa_list = NULL;
+               list_delete_and_null(&pim->msdp.sa_list);
        }
 }
index 04e3e10ff32a6b572295397f93b912db295684ae..dd77e2b084833d1e722dcdacb67c0179091ec753 100644 (file)
@@ -401,8 +401,7 @@ static void delete_prefix_list(struct pim_neighbor *neigh)
                }
 #endif
 
-               list_delete(neigh->prefix_list);
-               neigh->prefix_list = 0;
+               list_delete_and_null(&neigh->prefix_list);
        }
 }
 
@@ -412,7 +411,7 @@ void pim_neighbor_free(struct pim_neighbor *neigh)
 
        delete_prefix_list(neigh);
 
-       list_delete(neigh->upstream_jp_agg);
+       list_delete_and_null(&neigh->upstream_jp_agg);
        THREAD_OFF(neigh->jp_timer);
 
        XFREE(MTYPE_PIM_NEIGHBOR, neigh);
index 7a380796a1c88b625c2942b8d69761aa6ee0849d..a1de4837dbe654a265cc0cec795ae918834b03d0 100644 (file)
@@ -236,7 +236,7 @@ void pim_delete_tracked_nexthop(struct pim_instance *pim, struct prefix *addr,
                        pim_sendmsg_zebra_rnh(pim, zclient, pnc,
                                              ZEBRA_NEXTHOP_UNREGISTER);
 
-                       list_delete(pnc->rp_list);
+                       list_delete_and_null(&pnc->rp_list);
                        hash_free(pnc->upstream_hash);
 
                        hash_release(pim->rpf_hash, pnc);
index 9ab0709d3e77d396a375a69ea6676a9fc6491b71..c45b0ce14c34ca46e327f62811870db55b8bb864 100644 (file)
@@ -123,8 +123,7 @@ void pim_oil_init(struct pim_instance *pim)
 void pim_oil_terminate(struct pim_instance *pim)
 {
        if (pim->channel_oil_list)
-               list_delete(pim->channel_oil_list);
-       pim->channel_oil_list = NULL;
+               list_delete_and_null(&pim->channel_oil_list);
 
        if (pim->channel_oil_hash)
                hash_free(pim->channel_oil_hash);
index 5c7561f586432227a3a81e78b3cdf06ac535f97b..cb722c17b2be4b86c9141d8388d146e8dbad4912 100644 (file)
@@ -51,8 +51,7 @@ void pim_rp_list_hash_clean(void *data)
 {
        struct pim_nexthop_cache *pnc = (struct pim_nexthop_cache *)data;
 
-       list_delete(pnc->rp_list);
-       pnc->rp_list = NULL;
+       list_delete_and_null(&pnc->rp_list);
 
        hash_clean(pnc->upstream_hash, NULL);
        hash_free(pnc->upstream_hash);
@@ -110,7 +109,7 @@ void pim_rp_init(struct pim_instance *pim)
        pim->rp_table = route_table_init();
        if (!pim->rp_table) {
                zlog_err("Unable to alloc rp_table");
-               list_delete(pim->rp_list);
+               list_delete_and_null(&pim->rp_list);
                return;
        }
 
@@ -119,13 +118,13 @@ void pim_rp_init(struct pim_instance *pim)
        if (!rp_info) {
                zlog_err("Unable to alloc rp_info");
                route_table_finish(pim->rp_table);
-               list_delete(pim->rp_list);
+               list_delete_and_null(&pim->rp_list);
                return;
        }
 
        if (!str2prefix("224.0.0.0/4", &rp_info->group)) {
                zlog_err("Unable to convert 224.0.0.0/4 to prefix");
-               list_delete(pim->rp_list);
+               list_delete_and_null(&pim->rp_list);
                route_table_finish(pim->rp_table);
                XFREE(MTYPE_PIM_RP, rp_info);
                return;
@@ -140,7 +139,7 @@ void pim_rp_init(struct pim_instance *pim)
        rn = route_node_get(pim->rp_table, &rp_info->group);
        if (!rn) {
                zlog_err("Failure to get route node for pim->rp_table");
-               list_delete(pim->rp_list);
+               list_delete_and_null(&pim->rp_list);
                route_table_finish(pim->rp_table);
                XFREE(MTYPE_PIM_RP, rp_info);
                return;
@@ -155,8 +154,7 @@ void pim_rp_init(struct pim_instance *pim)
 void pim_rp_free(struct pim_instance *pim)
 {
        if (pim->rp_list)
-               list_delete(pim->rp_list);
-       pim->rp_list = NULL;
+               list_delete_and_null(&pim->rp_list);
 }
 
 /*
index 9e90a34687098c34a2befc78b5ffb97d75552e68..8e7da0f121e86c60bf3ac4c221776795854fec9c 100644 (file)
@@ -50,10 +50,8 @@ void pim_ssmpingd_init(struct pim_instance *pim)
 
 void pim_ssmpingd_destroy(struct pim_instance *pim)
 {
-       if (pim->ssmpingd_list) {
-               list_delete(pim->ssmpingd_list);
-               pim->ssmpingd_list = 0;
-       }
+       if (pim->ssmpingd_list)
+               list_delete_and_null(&pim->ssmpingd_list);
 }
 
 static struct ssmpingd_sock *ssmpingd_find(struct pim_instance *pim,
index 6d7adf24224f9436c27d1709f6d64f3c383f7fd6..3c9ef28f5a2d93dfd2b5506c490f70e9b39864f8 100644 (file)
@@ -654,12 +654,12 @@ int pim_parse_addr_source(struct prefix_sg *sg, uint8_t *flags,
        return addr - buf;
 }
 
-#define FREE_ADDR_LIST(hello_option_addr_list)                                 \
-       {                                                                      \
-               if (hello_option_addr_list) {                                  \
-                       list_delete(hello_option_addr_list);                   \
-                       hello_option_addr_list = 0;                            \
-               }                                                              \
+#define FREE_ADDR_LIST(hello_option_addr_list)                         \
+       {                                                               \
+               if (hello_option_addr_list) {                           \
+                       list_delete_and_null(&hello_option_addr_list);  \
+                       hello_option_addr_list = 0;                     \
+               }                                                       \
        }
 
 int pim_tlv_parse_addr_list(const char *ifname, struct in_addr src_addr,
index 0bf2ce5d562e46f3523b566180a4424d93ea7368..ed5d1ecaa2f92109424439a857049913438b211e 100644 (file)
@@ -82,8 +82,7 @@ static void pim_upstream_remove_children(struct pim_instance *pim,
                if (child)
                        child->parent = NULL;
        }
-       list_delete(up->sources);
-       up->sources = NULL;
+       list_delete_and_null(&up->sources);
 }
 
 /*
@@ -203,13 +202,12 @@ struct pim_upstream *pim_upstream_del(struct pim_instance *pim,
 
        pim_upstream_remove_children(pim, up);
        if (up->sources)
-               list_delete(up->sources);
-       up->sources = NULL;
+               list_delete_and_null(&up->sources);
+
        pim_mroute_del(up->channel_oil, __PRETTY_FUNCTION__);
        upstream_channel_oil_detach(up);
 
-       list_delete(up->ifchannels);
-       up->ifchannels = NULL;
+       list_delete_and_null(&up->ifchannels);
 
        /*
          notice that listnode_delete() can't be moved
@@ -696,9 +694,9 @@ static struct pim_upstream *pim_upstream_new(struct pim_instance *pim,
 
                pim_upstream_remove_children(pim, up);
                if (up->sources)
-                       list_delete(up->sources);
+                       list_delete_and_null(&up->sources);
 
-               list_delete(up->ifchannels);
+               list_delete_and_null(&up->ifchannels);
 
                hash_release(pim->upstream_hash, up);
                XFREE(MTYPE_PIM_UPSTREAM, up);
@@ -1548,8 +1546,7 @@ unsigned int pim_upstream_hash_key(void *arg)
 void pim_upstream_terminate(struct pim_instance *pim)
 {
        if (pim->upstream_list)
-               list_delete(pim->upstream_list);
-       pim->upstream_list = NULL;
+               list_delete_and_null(&pim->upstream_list);
 
        if (pim->upstream_hash)
                hash_free(pim->upstream_hash);
index 6b539046f5d1e405b0394ce6cdeb76df581cb8dd..0e0230c9d2b9bf0fa33d1a950c7bbba36b72a429 100644 (file)
@@ -363,7 +363,7 @@ void rip_offset_init()
 
 void rip_offset_clean()
 {
-       list_delete(rip_offset_list_master);
+       list_delete_and_null(&rip_offset_list_master);
 
        rip_offset_list_master = list_new();
        rip_offset_list_master->cmp = (int (*)(void *, void *))offset_list_cmp;
index 921b65009a28e895321297cd80d213d862d7e9b4..2a0752253f4b162812f4ea3c7bb0663db026596d 100644 (file)
@@ -3809,7 +3809,7 @@ void rip_clean(void)
                                        RIP_TIMER_OFF(rinfo->t_garbage_collect);
                                        rip_info_free(rinfo);
                                }
-                               list_delete(list);
+                               list_delete_and_null(&list);
                                rp->info = NULL;
                                route_unlock_node(rp);
                        }
index 75b3c9dfec9c64703f7089c2f38dc840f7aba71d..2e0841c5d4ce936d237d4c0e14311de176e8793b 100644 (file)
@@ -72,7 +72,7 @@ struct list *ripng_rte_new(void)
 
 void ripng_rte_free(struct list *ripng_rte_list)
 {
-       list_delete(ripng_rte_list);
+       list_delete_and_null(&ripng_rte_list);
 }
 
 /* Delete RTE */
index efbdc1ffe8a18fa14e8af7adc149e07c9856c7e6..82f8a7aa66c8fdec54f9173fe20dadce99d743a7 100644 (file)
@@ -375,7 +375,7 @@ void ripng_offset_init(void)
 
 void ripng_offset_clean(void)
 {
-       list_delete(ripng_offset_list_master);
+       list_delete_and_null(&ripng_offset_list_master);
 
        ripng_offset_list_master = list_new();
        ripng_offset_list_master->cmp =
index e4368c9f9f51653bf95cf411e2a8603221637ffe..1e423150285b3d08adead6152f0c20d014211c15 100644 (file)
@@ -2829,7 +2829,7 @@ void ripng_clean()
                                                rinfo->t_garbage_collect);
                                        ripng_info_free(rinfo);
                                }
-                               list_delete(list);
+                               list_delete_and_null(&list);
                                rp->info = NULL;
                                route_unlock_node(rp);
                        }
index e61e9639ee94d2b7fb4029c0f1aa5bf0e0f5d731..1f5abba392803a1b020975434d21740fca297438 100644 (file)
@@ -166,7 +166,7 @@ static int test(FILE *input, FILE *output)
                sbuf_push(&fragment_format, 0, "%s", isis_format_tlvs(tlvs));
                isis_free_tlvs(tlvs);
        }
-       list_delete(fragments);
+       list_delete_and_null(&fragments);
        stream_free(s);
 
        char *fragment_content = sortlines((char *)sbuf_buf(&fragment_format));
index d7e79d6b2cc1660758a8d279d1c55f3f014d7b1c..e6ef924501c775e3f3637c90eba0a218c08cc796 100644 (file)
@@ -73,7 +73,7 @@ static int config_cmp(struct config *c1, struct config *c2)
 
 static void config_del(struct config *config)
 {
-       list_delete(config->line);
+       list_delete_and_null(&config->line);
        if (config->name)
                XFREE(MTYPE_VTYSH_CONFIG_LINE, config->name);
        XFREE(MTYPE_VTYSH_CONFIG, config);
@@ -365,7 +365,7 @@ void vtysh_config_dump(FILE *fp)
 
        for (i = 0; i < vector_active(configvec); i++)
                if ((master = vector_slot(configvec, i)) != NULL) {
-                       list_delete(master);
+                       list_delete_and_null(&master);
                        vector_slot(configvec, i) = NULL;
                }
        list_delete_all_node(config_top);
index 664e493d84f157a0417972241ee59d3e7c48e953..9a9f76eab103f32d19119f653a0c131d07fa46d5 100644 (file)
@@ -64,7 +64,7 @@ static void zebra_if_node_destroy(route_table_delegate_t *delegate,
                                  struct route_node *node)
 {
        if (node->info)
-               list_delete(node->info);
+               list_delete_and_null((struct list **)&node->info);
        route_node_destroy(delegate, table, node);
 }
 
@@ -627,7 +627,7 @@ static void if_delete_connected(struct interface *ifp)
                                }
 
                                /* Free chain list and respective route node. */
-                               list_delete(addr_list);
+                               list_delete_and_null(&addr_list);
                                rn->info = NULL;
                                route_unlock_node(rn);
                        } else if (cp.family == AF_INET6) {
index 0df03860d0eefc9e73b96da1d38979cf3cbdbc72..8234ed6bddd54fa3cb44eff5171b19c6b20dfcd3 100644 (file)
@@ -311,8 +311,7 @@ static void irdp_if_stop(struct interface *ifp)
 
        irdp_advert_off(ifp);
 
-       list_delete(irdp->AdvPrefList);
-       irdp->AdvPrefList = NULL;
+       list_delete_and_null(&irdp->AdvPrefList);
 
        irdp->flags = 0;
 }
index 1ed5eacd80b036bf8683bddc3968d02ae3b11369..6fbb7517892e42e58dde6fb6ce05c6a4beb15f10 100644 (file)
@@ -375,5 +375,5 @@ int release_daemon_chunks(u_char proto, u_short instance)
 
 void label_manager_close()
 {
-       list_delete(lbl_mgr.lc_list);
+       list_delete_and_null(&lbl_mgr.lc_list);
 }
index bf1971c4704dba061e532021578b8db7733df8e9..5a2979c866af00e5fc2b2a233d6924bc5fff2f74 100644 (file)
@@ -145,7 +145,7 @@ static void sigint(void)
        prefix_list_reset();
        route_map_finish();
 
-       list_delete(zebrad.client_list);
+       list_delete_and_null(&zebrad.client_list);
        work_queue_free(zebrad.ribq);
        if (zebrad.lsp_process_q)
                work_queue_free(zebrad.lsp_process_q);
index 3c7319f35de3ef83ab96acbc730fccbf36afcec0..9fd07d22d88ba4afb13484960e0a75c1ed77f9c7 100644 (file)
@@ -2701,7 +2701,7 @@ void zebra_mpls_print_lsp_table(struct vty *vty, struct zebra_vrf *zvrf,
                vty_out(vty, "\n");
        }
 
-       list_delete(lsp_list);
+       list_delete_and_null(&lsp_list);
 }
 
 /*
@@ -2740,7 +2740,7 @@ int zebra_mpls_write_lsp_config(struct vty *vty, struct zebra_vrf *zvrf)
                }
        }
 
-       list_delete(slsp_list);
+       list_delete_and_null(&slsp_list);
        return (zvrf->slsp_table->count ? 1 : 0);
 }
 
index fab8c3c9329e921b367fc24015c91dcdf7ff0464..5c3ec10a79fc961c7cd3bdbc1758c972d0687e84 100644 (file)
@@ -1875,7 +1875,7 @@ void meta_queue_free(struct meta_queue *mq)
        unsigned i;
 
        for (i = 0; i < MQ_SIZE; i++)
-               list_delete(mq->subq[i]);
+               list_delete_and_null(&mq->subq[i]);
 
        XFREE(MTYPE_WORK_QUEUE, mq);
 }
index a3f43f947a2a30a7dc8c2f62aad2951e62eb0785..b704b97c5e06e1e36e520c913b3b539f64bdd68e 100644 (file)
@@ -1587,7 +1587,7 @@ static int zvni_mac_del(zebra_vni_t *zvni, zebra_mac_t *mac)
 {
        zebra_mac_t *tmp_mac;
 
-       list_delete(mac->neigh_list);
+       list_delete_and_null(&mac->neigh_list);
 
        /* Free the VNI hash entry and allocated memory. */
        tmp_mac = hash_release(zvni->mac_table, mac);