]> 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)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Sun, 19 Mar 2023 04:29:22 +0000 (04:29 +0000)
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>
(cherry picked from commit 7773d0071ab4eb1b725581c525c3e152f2c806c7)

ospfd/ospf_apiserver.c
ospfd/ospf_opaque.c

index ee29ed8aaef7f04a0ee639d0a3ffe143300fa4e7..6415fda1fcc9f88838bb0bf9fbf4042d3a9f07d4 100644 (file)
@@ -181,9 +181,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)
@@ -338,6 +343,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) {
@@ -359,6 +365,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);
@@ -904,6 +912,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 e053178a3801fe7d7f7d2fbb86347a7267353323..e085814c66902c4f09bba1b63b7db85ff0184635 100644 (file)
@@ -132,6 +132,10 @@ void ospf_opaque_finish(void)
 
        ospf_ext_finish();
 
+#ifdef SUPPORT_OSPF_API
+       ospf_apiserver_term();
+#endif
+
        ospf_sr_finish();
 }