From 4029fa48a18e3a6c8af3a2478558e74184fd1786 Mon Sep 17 00:00:00 2001
From: "nevadita.chatterjee" <nevadita.chatterjee@iopsys.eu>
Date: Mon, 11 Apr 2022 16:45:06 +0530
Subject: [PATCH] map-controller: Fixing memory leaks

---
 src/cntlr.c | 33 +++++++++++++++++++++------------
 1 file changed, 21 insertions(+), 12 deletions(-)

diff --git a/src/cntlr.c b/src/cntlr.c
index 4ba8a59d..cae9d665 100644
--- a/src/cntlr.c
+++ b/src/cntlr.c
@@ -1357,19 +1357,27 @@ struct node *alloc_node_init(struct controller *c, uint8_t *hwaddr)
 	return n;
 }
 
-#if 0
-void node_clean_stalist(struct node *n)
+void node_clean_stalist(struct controller *c)
 {
-	struct radio_policy *r = NULL, *tmp;
+	struct sta *s = NULL, *tmp;
 
-	list_for_each_entry_safe(p, tmp, &n->stalist, list) {
-		list_del(&->list);
-		free(p);
+	list_for_each_entry_safe(s, tmp, &c->stalist, list) {
+		list_del(&s->list);
+		free(s);
 	}
+}
 
-	return 0;
+void node_clean_linklist(struct controller *c)
+{
+        struct netif_link *l = NULL, *tmp;
+
+        list_for_each_entry_safe(l, tmp, &c->linklist, list) {
+		free(l->metrics);
+                list_del(&l->list);
+                free(l);
+        }
 }
-#endif
+
 
 static void radio_clean_iflist(struct netif_radio *r)
 {
@@ -1397,8 +1405,10 @@ static void cntlr_clean_nodelist(struct controller *c)
 	struct node *n = NULL, *tmp;
 
 	list_for_each_entry_safe(n, tmp, &c->nodelist, list) {
-		list_del(&n->list);
+		node_clean_stalist(c);
+		node_clean_linklist(c);
 		node_clean_radiolist(n);
+		list_del(&n->list);
 		free(n);
 	}
 }
@@ -2548,13 +2558,12 @@ void run_controller(void)
 	uloop_run();
 
 out_exit:
-	ubus_unregister_event_handler(ctx, &c->evh);
 	map_unsubscribe(ctx, c->subscriber);
+	cntlr_clean_nodelist(c);
+	ubus_unregister_event_handler(ctx, &c->evh);
 	cntlr_remove_object(c);
 	cmdu_ackq_free(&c->cmdu_ack_q);
 	cntlr_config_clean(&c->cfg);
-	cntlr_clean_nodelist(c);
-	ubus_free(ctx);
 	uloop_done();
 	free(c);
 }
-- 
GitLab