]> git.proxmox.com Git - mirror_frr.git/commitdiff
ospfd: Cleanup some memory leaks on shutdown in ospf_apiserver.c
authorDonald Sharp <sharpd@nvidia.com>
Sat, 18 Mar 2023 19:35:34 +0000 (15:35 -0400)
committerDonald Sharp <sharpd@nvidia.com>
Sat, 18 Mar 2023 19:35:34 +0000 (15:35 -0400)
Clean up some memory leaks found in ospf_apiserver.c  Also
a crash in the original implementation.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
ospfd/ospf_apiserver.c
ospfd/ospf_opaque.c

index 5e4fc30a2880417d9be8a0faf3114ae2df06b871..086b5660b1daabf70407e6675afa37b2ed978afb 100644 (file)
@@ -166,9 +166,14 @@ void ospf_apiserver_term(void)
         * Free all client instances.  ospf_apiserver_free removes the node
         * from the list, so we examine the head of the list anew each time.
         */
-       while (apiserver_list
-              && (apiserv = listgetdata(listhead(apiserver_list))) != NULL)
+       if (!apiserver_list)
+               return;
+
+       while (listcount(apiserver_list)) {
+               apiserv = listgetdata(listhead(apiserver_list));
+
                ospf_apiserver_free(apiserv);
+       }
 
        /* Free client list itself */
        if (apiserver_list)
@@ -323,6 +328,7 @@ void ospf_apiserver_free(struct ospf_apiserver *apiserv)
                ospf_apiserver_unregister_opaque_type(
                        apiserv, regtype->lsa_type, regtype->opaque_type);
        }
+       list_delete(&apiserv->opaque_types);
 
        /* Close connections to OSPFd. */
        if (apiserv->fd_sync > 0) {
@@ -344,6 +350,8 @@ void ospf_apiserver_free(struct ospf_apiserver *apiserv)
        /* Remove from the list of active clients. */
        listnode_delete(apiserver_list, apiserv);
 
+       XFREE(MTYPE_APISERVER_MSGFILTER, apiserv->filter);
+
        if (IS_DEBUG_OSPF_EVENT)
                zlog_debug("API: Delete apiserv(%p), total#(%d)",
                           (void *)apiserv, apiserver_list->count);
@@ -889,6 +897,7 @@ int ospf_apiserver_unregister_opaque_type(struct ospf_apiserver *apiserv,
                        /* Remove from list of registered opaque types */
                        listnode_delete(apiserv->opaque_types, regtype);
 
+                       XFREE(MTYPE_APISERVER, regtype);
                        if (IS_DEBUG_OSPF_EVENT)
                                zlog_debug(
                                        "API: Del LSA-type(%d)/Opaque-type(%d) from apiserv(%p), total#(%d)",
index 2e8e48bb5a6337008526ff6c88a212ab3ad0a91d..fa04f092dcf6e538d182bd4b57b590185f100a27 100644 (file)
@@ -117,6 +117,10 @@ void ospf_opaque_finish(void)
 
        ospf_ext_finish();
 
+#ifdef SUPPORT_OSPF_API
+       ospf_apiserver_term();
+#endif
+
        ospf_sr_finish();
 }