]> git.puffer.fish Git - matthieu/frr.git/commitdiff
*: Convert prefix_free to double pointer
authorDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 30 Oct 2019 00:05:27 +0000 (20:05 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Sat, 2 Nov 2019 20:13:44 +0000 (16:13 -0400)
Have the prefix_free code take a double pointer to free the data.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
15 files changed:
bgpd/bgp_debug.c
bgpd/bgp_route.c
bgpd/bgpd.c
bgpd/rfapi/rfapi_import.c
bgpd/rfapi/vnc_import_bgp.c
eigrpd/eigrp_network.c
eigrpd/eigrp_topology.c
isisd/isis_circuit.c
lib/if.c
lib/prefix.c
lib/prefix.h
pbrd/pbr_vty.c
pimd/pim_neighbor.c
pimd/pim_tlv.c
staticd/static_zebra.c

index f476b161884ad8eaf6afa02c9523cda7d1fce692..0e4c3a3e125760bb82f59764ca8ee9fba589063f 100644 (file)
@@ -209,7 +209,7 @@ static void bgp_debug_list_free(struct list *list)
                        listnode_delete(list, filter);
 
                        if (filter->p)
-                               prefix_free(filter->p);
+                               prefix_free(&filter->p);
 
                        if (filter->host)
                                XFREE(MTYPE_BGP_DEBUG_STR, filter->host);
@@ -323,7 +323,7 @@ static int bgp_debug_list_remove_entry(struct list *list, const char *host,
                } else if (p && filter->p->prefixlen == p->prefixlen
                           && prefix_match(filter->p, p)) {
                        listnode_delete(list, filter);
-                       prefix_free(filter->p);
+                       prefix_free(&filter->p);
                        XFREE(MTYPE_BGP_DEBUG_FILTER, filter);
                        return 1;
                }
@@ -1412,7 +1412,7 @@ DEFPY (debug_bgp_update_prefix_afi_safi,
 
        ret = bgp_debug_parse_evpn_prefix(vty, argv, argc, &argv_p);
        if (ret != CMD_SUCCESS) {
-               prefix_free(argv_p);
+               prefix_free(&argv_p);
                return ret;
        }
 
@@ -1425,7 +1425,7 @@ DEFPY (debug_bgp_update_prefix_afi_safi,
                vty_out(vty,
                        "BGP updates debugging is already enabled for %s\n",
                        buf);
-               prefix_free(argv_p);
+               prefix_free(&argv_p);
                return CMD_SUCCESS;
        }
 
@@ -1438,7 +1438,7 @@ DEFPY (debug_bgp_update_prefix_afi_safi,
                vty_out(vty, "BGP updates debugging is on for %s\n", buf);
        }
 
-       prefix_free(argv_p);
+       prefix_free(&argv_p);
 
        return CMD_SUCCESS;
 }
@@ -1477,7 +1477,7 @@ DEFPY (no_debug_bgp_update_prefix_afi_safi,
 
        ret = bgp_debug_parse_evpn_prefix(vty, argv, argc, &argv_p);
        if (ret != CMD_SUCCESS) {
-               prefix_free(argv_p);
+               prefix_free(&argv_p);
                return ret;
        }
 
@@ -1505,7 +1505,7 @@ DEFPY (no_debug_bgp_update_prefix_afi_safi,
                vty_out(vty, "BGP updates debugging was not enabled for %s\n",
                        buf);
 
-       prefix_free(argv_p);
+       prefix_free(&argv_p);
 
        return ret;
 }
index 41e32b31121310754df4883aaf49beea2904e762..c07fa2516ec7f301896e801399f6d79954813ea6 100644 (file)
@@ -10548,7 +10548,7 @@ static int bgp_show_prefix_longer(struct vty *vty, struct bgp *bgp,
        }
 
        ret = bgp_show(vty, bgp, afi, safi, type, p, 0);
-       prefix_free(p);
+       prefix_free(&p);
        return ret;
 }
 
index 06f6f933ac7d7f939d51e67557ac2b9066cc42fc..7621d7ef0f52a2f712e6463e3f32eef0940354aa 100644 (file)
@@ -2586,7 +2586,7 @@ int peer_group_delete(struct peer_group *group)
        for (afi = AFI_IP; afi < AFI_MAX; afi++) {
                for (ALL_LIST_ELEMENTS(group->listen_range[afi], node, nnode,
                                       prefix)) {
-                       prefix_free(prefix);
+                       prefix_free(&prefix);
                }
                list_delete(&group->listen_range[afi]);
        }
index fe8e874440be19e0f46a677ffe3b360b1895fbc2..660442b49209fd72c6258a6f4eb6fe9d1994938f 100644 (file)
@@ -1512,7 +1512,7 @@ static int rfapiNhlAddNodeRoutes(
        }
 
        seen_nexthops =
-               skiplist_new(0, vnc_prefix_cmp, (void (*)(void *))prefix_free);
+               skiplist_new(0, vnc_prefix_cmp, prefix_free_lists);
 
        for (bpi = rn->info; bpi; bpi = bpi->next) {
 
@@ -4359,7 +4359,7 @@ rfapiImportTableRefAdd(struct bgp *bgp, struct ecommunity *rt_import_list,
                it->rt_import_list = ecommunity_dup(rt_import_list);
                it->rfg = rfg;
                it->monitor_exterior_orphans =
-                       skiplist_new(0, NULL, (void (*)(void *))prefix_free);
+                       skiplist_new(0, NULL, prefix_free_lists);
 
                /*
                 * fill import route tables from RIBs
index df06105535d55ca92767e0a71e94086c5732557e..6e8969ad18c8b62de10c22e11ae27c610c1b8ece 100644 (file)
@@ -1807,8 +1807,7 @@ static void vnc_import_bgp_exterior_add_route_it(
                                        RFAPI_MONITOR_EXTERIOR(rn)->source =
                                                skiplist_new(
                                                        0, NULL,
-                                                       (void (*)(void *))
-                                                               prefix_free);
+                                                       prefix_free_lists);
                                        agg_lock_node(rn); /* for skiplist */
                                }
                                agg_lock_node(rn); /* for skiplist entry */
@@ -2194,8 +2193,7 @@ void vnc_import_bgp_exterior_add_route_interior(
                                             ->source) {
                                        RFAPI_MONITOR_EXTERIOR(rn_interior)
                                                ->source = skiplist_new(
-                                               0, NULL,
-                                               (void (*)(void *))prefix_free);
+                                               0, NULL, prefix_free_lists);
                                        agg_lock_node(rn_interior);
                                }
                                skiplist_insert(
@@ -2337,8 +2335,7 @@ void vnc_import_bgp_exterior_add_route_interior(
                        if (!RFAPI_MONITOR_EXTERIOR(rn_interior)->source) {
                                RFAPI_MONITOR_EXTERIOR(rn_interior)->source =
                                        skiplist_new(
-                                               0, NULL,
-                                               (void (*)(void *))prefix_free);
+                                               0, NULL, prefix_free_lists);
                                agg_lock_node(rn_interior); /* sl */
                        }
                        skiplist_insert(
@@ -2527,8 +2524,7 @@ void vnc_import_bgp_exterior_del_route_interior(
                        if (!RFAPI_MONITOR_EXTERIOR(par)->source) {
                                RFAPI_MONITOR_EXTERIOR(par)->source =
                                        skiplist_new(
-                                               0, NULL,
-                                               (void (*)(void *))prefix_free);
+                                               0, NULL, prefix_free_lists);
                                agg_lock_node(par); /* sl */
                        }
                        skiplist_insert(RFAPI_MONITOR_EXTERIOR(par)->source,
index 3e09ec41bbc8c3e7e86207ab5a68505c73cf0e75..324f309290dbb0bb8d341ae6efab577f6051da2e 100644 (file)
@@ -327,8 +327,7 @@ int eigrp_network_unset(struct eigrp *eigrp, struct prefix *p)
        if (!IPV4_ADDR_SAME(&pref->u.prefix4, &p->u.prefix4))
                return 0;
 
-       prefix_ipv4_free(rn->info);
-       rn->info = NULL;
+       prefix_ipv4_free((struct prefix_ipv4 **)&rn->info);
        route_unlock_node(rn); /* initial reference */
 
        /* Find interfaces that not configured already.  */
index 9cc612eaf1ef210c98b592bd8b159866185ff82a..56dbe3d85e38871eea402ed9abc6555ff643d75e 100644 (file)
@@ -197,7 +197,7 @@ void eigrp_prefix_entry_delete(struct eigrp *eigrp, struct route_table *table,
        list_delete(&pe->entries);
        list_delete(&pe->rij);
        eigrp_zebra_route_delete(eigrp, pe->destination);
-       prefix_free(pe->destination);
+       prefix_free(&pe->destination);
 
        rn->info = NULL;
        route_unlock_node(rn); // Lookup above
index 1d0e6549df878b47968adade1c5cd35c20ae7532..8343f7d85fe59565b7d0ebee21286e18b64ba0cb 100644 (file)
@@ -338,7 +338,7 @@ void isis_circuit_del_addr(struct isis_circuit *circuit,
 
                if (ip) {
                        listnode_delete(circuit->ip_addrs, ip);
-                       prefix_ipv4_free(ip);
+                       prefix_ipv4_free(&ip);
                        if (circuit->area)
                                lsp_regenerate_schedule(circuit->area,
                                                        circuit->is_type, 0);
@@ -358,7 +358,7 @@ void isis_circuit_del_addr(struct isis_circuit *circuit,
                        zlog_warn("End of addresses");
                }
 
-               prefix_ipv4_free(ipv4);
+               prefix_ipv4_free(&ipv4);
        }
        if (connected->address->family == AF_INET6) {
                ipv6 = prefix_ipv6_new();
@@ -374,7 +374,7 @@ void isis_circuit_del_addr(struct isis_circuit *circuit,
                        }
                        if (ip6) {
                                listnode_delete(circuit->ipv6_link, ip6);
-                               prefix_ipv6_free(ip6);
+                               prefix_ipv6_free(&ip6);
                                found = 1;
                        }
                } else {
@@ -386,7 +386,7 @@ void isis_circuit_del_addr(struct isis_circuit *circuit,
                        }
                        if (ip6) {
                                listnode_delete(circuit->ipv6_non_link, ip6);
-                               prefix_ipv6_free(ip6);
+                               prefix_ipv6_free(&ip6);
                                found = 1;
                        }
                }
@@ -417,7 +417,7 @@ void isis_circuit_del_addr(struct isis_circuit *circuit,
                        lsp_regenerate_schedule(circuit->area, circuit->is_type,
                                                0);
 
-               prefix_ipv6_free(ipv6);
+               prefix_ipv6_free(&ipv6);
        }
        return;
 }
index 7c3606bbbf9b617187992b2749460ef5f5d6da5f..a185d53ef78f661214fcf73893c4e9b27ce07e39 100644 (file)
--- a/lib/if.c
+++ b/lib/if.c
@@ -869,10 +869,10 @@ struct nbr_connected *nbr_connected_new(void)
 void connected_free(struct connected *connected)
 {
        if (connected->address)
-               prefix_free(connected->address);
+               prefix_free(&connected->address);
 
        if (connected->destination)
-               prefix_free(connected->destination);
+               prefix_free(&connected->destination);
 
        XFREE(MTYPE_CONNECTED_LABEL, connected->label);
 
@@ -883,7 +883,7 @@ void connected_free(struct connected *connected)
 void nbr_connected_free(struct nbr_connected *connected)
 {
        if (connected->address)
-               prefix_free(connected->address);
+               prefix_free(&connected->address);
 
        XFREE(MTYPE_NBR_CONNECTED, connected);
 }
index 5071ca8201b4f05d01d8d78b0580c03f2170c92a..e2bf3b949ceae77868eeca5bde085174c7072925 100644 (file)
@@ -905,9 +905,9 @@ struct prefix_ipv4 *prefix_ipv4_new(void)
 }
 
 /* Free prefix_ipv4 structure. */
-void prefix_ipv4_free(struct prefix_ipv4 *p)
+void prefix_ipv4_free(struct prefix_ipv4 **p)
 {
-       prefix_free((struct prefix *)p);
+       prefix_free((struct prefix **)p);
 }
 
 /* If given string is valid return 1 else return 0 */
@@ -1077,9 +1077,9 @@ struct prefix_ipv6 *prefix_ipv6_new(void)
 }
 
 /* Free prefix for IPv6. */
-void prefix_ipv6_free(struct prefix_ipv6 *p)
+void prefix_ipv6_free(struct prefix_ipv6 **p)
 {
-       prefix_free((struct prefix *)p);
+       prefix_free((struct prefix **)p);
 }
 
 /* If given string is valid return 1 else return 0 */
@@ -1484,10 +1484,18 @@ struct prefix *prefix_new(void)
        return p;
 }
 
+void prefix_free_lists(void *arg)
+{
+       struct prefix *p = arg;
+
+       prefix_free(&p);
+}
+
 /* Free prefix structure. */
-void prefix_free(struct prefix *p)
+void prefix_free(struct prefix **p)
 {
-       XFREE(MTYPE_PREFIX, p);
+       XFREE(MTYPE_PREFIX, *p);
+       *p = NULL;
 }
 
 /* Utility function to convert ipv4 prefixes to Classful prefixes */
index 784927616a3445b3255f5172a81212784622bbe1..7a93c766a329da16407d60c131dce136f3ea62eb 100644 (file)
@@ -396,7 +396,11 @@ extern unsigned int prefix6_bit(const struct in6_addr *prefix,
                                const uint16_t prefixlen);
 
 extern struct prefix *prefix_new(void);
-extern void prefix_free(struct prefix *);
+extern void prefix_free(struct prefix **p);
+/*
+ * Function to handle prefix_free being used as a del function.
+ */
+extern void prefix_free_lists(void *arg);
 extern const char *prefix_family_str(const struct prefix *);
 extern int prefix_blen(const struct prefix *);
 extern int str2prefix(const char *, struct prefix *);
@@ -435,7 +439,7 @@ extern void prefix2sockunion(const struct prefix *, union sockunion *);
 extern int str2prefix_eth(const char *, struct prefix_eth *);
 
 extern struct prefix_ipv4 *prefix_ipv4_new(void);
-extern void prefix_ipv4_free(struct prefix_ipv4 *);
+extern void prefix_ipv4_free(struct prefix_ipv4 **p);
 extern int str2prefix_ipv4(const char *, struct prefix_ipv4 *);
 extern void apply_mask_ipv4(struct prefix_ipv4 *);
 
@@ -460,7 +464,7 @@ extern in_addr_t ipv4_broadcast_addr(in_addr_t hostaddr, int masklen);
 extern int netmask_str2prefix_str(const char *, const char *, char *);
 
 extern struct prefix_ipv6 *prefix_ipv6_new(void);
-extern void prefix_ipv6_free(struct prefix_ipv6 *);
+extern void prefix_ipv6_free(struct prefix_ipv6 **p);
 extern int str2prefix_ipv6(const char *, struct prefix_ipv6 *);
 extern void apply_mask_ipv6(struct prefix_ipv6 *);
 
index 069b3e6c9b71b1ec9b1922f30e139a2e6f7b18a7..e0fd147b0e8dbdcf425e64ee2d537a1f5f5b2659 100644 (file)
@@ -133,10 +133,8 @@ DEFPY(pbr_map_match_src, pbr_map_match_src_cmd,
                if (!pbrms->src)
                        pbrms->src = prefix_new();
                prefix_copy(pbrms->src, prefix);
-       } else {
-               prefix_free(pbrms->src);
-               pbrms->src = 0;
-       }
+       } else
+               prefix_free(&pbrms->src);
 
        pbr_map_check(pbrms);
 
@@ -162,10 +160,8 @@ DEFPY(pbr_map_match_dst, pbr_map_match_dst_cmd,
                if (!pbrms->dst)
                        pbrms->dst = prefix_new();
                prefix_copy(pbrms->dst, prefix);
-       } else {
-               prefix_free(pbrms->dst);
-               pbrms->dst = NULL;
-       }
+       } else
+               prefix_free(&pbrms->dst);
 
        pbr_map_check(pbrms);
 
index 722ecb2a7220690a72fd602373342b23e580ac16..3f2aaf2bbed0ee210d8a94a8eca1859fdc5ef8ca 100644 (file)
@@ -767,7 +767,7 @@ static void delete_from_neigh_addr(struct interface *ifp,
                                                other_neigh_str, ifp->name);
 
                                        listnode_delete(neigh->prefix_list, p);
-                                       prefix_free(p);
+                                       prefix_free(&p);
                                }
                        }
 
index d93a360448edb06fec21146fd20dcecefbe76158..4fe3237395ec47a5db322cc904d1dae20c094f97 100644 (file)
@@ -757,8 +757,7 @@ int pim_tlv_parse_addr_list(const char *ifname, struct in_addr src_addr,
                 */
                if (!*hello_option_addr_list) {
                        *hello_option_addr_list = list_new();
-                       (*hello_option_addr_list)->del =
-                               (void (*)(void *))prefix_free;
+                       (*hello_option_addr_list)->del = prefix_free_lists;
                }
 
                /*
index 976f892efbb43a6e81c2e3de40cfe21fb49c15aa..049cb4b4fa698e63762a84f074ab8216ba990f6f 100644 (file)
@@ -260,7 +260,7 @@ static void static_nht_hash_free(void *data)
 {
        struct static_nht_data *nhtd = data;
 
-       prefix_free(nhtd->nh);
+       prefix_free(&nhtd->nh);
        XFREE(MTYPE_TMP, nhtd);
 }