From 31aaf60e9b10caedd9aaf2a22ce1af2d60c5bb9d Mon Sep 17 00:00:00 2001
From: Guus Sliepen <guus@meshlink.io>
Date: Tue, 4 May 2021 21:52:55 +0200
Subject: [PATCH] Fix several memory leaks.

Found by the AddressSanitizer.
---
 src/meshlink.c         | 3 +++
 test/channels-aio-fd.c | 1 +
 test/channels-aio.c    | 3 +++
 test/get-all-nodes.c   | 2 ++
 test/storage-policy.c  | 1 +
 5 files changed, 10 insertions(+)

diff --git a/src/meshlink.c b/src/meshlink.c
index 4280c4f1..5d5733e7 100644
--- a/src/meshlink.c
+++ b/src/meshlink.c
@@ -3399,6 +3399,7 @@ bool meshlink_import(meshlink_handle_t *mesh, const char *data) {
 
 	if(!buflen) {
 		logger(mesh, MESHLINK_DEBUG, "Invalid data\n");
+		free(buf);
 		meshlink_errno = MESHLINK_EPEER;
 		return false;
 	}
@@ -3408,6 +3409,7 @@ bool meshlink_import(meshlink_handle_t *mesh, const char *data) {
 
 	if(!count) {
 		logger(mesh, MESHLINK_DEBUG, "Invalid data\n");
+		free(buf);
 		meshlink_errno = MESHLINK_EPEER;
 		return false;
 	}
@@ -3464,6 +3466,7 @@ bool meshlink_import(meshlink_handle_t *mesh, const char *data) {
 
 		if(!node_write_config(mesh, n, true)) {
 			free_node(n);
+			free(buf);
 			return false;
 		}
 
diff --git a/test/channels-aio-fd.c b/test/channels-aio-fd.c
index 78d9078b..3cac823c 100644
--- a/test/channels-aio-fd.c
+++ b/test/channels-aio-fd.c
@@ -175,4 +175,5 @@ int main(void) {
 	// Clean up.
 
 	close_meshlink_pair(mesh_a, mesh_b);
+	free(outdata);
 }
diff --git a/test/channels-aio.c b/test/channels-aio.c
index d424b843..19472bad 100644
--- a/test/channels-aio.c
+++ b/test/channels-aio.c
@@ -189,9 +189,12 @@ int main(void) {
 		// The non-AIO transfer should have completed before everything else
 		assert(!timespec_lt(&out_infos[i].aio_infos[0].ts, &b_received_ts));
 		assert(!timespec_lt(&in_infos[i].aio_infos[0].ts, &b_received_ts));
+
+		free(in_infos[i].data);
 	}
 
 	// Clean up.
 
 	close_meshlink_pair(mesh_a, mesh_b);
+	free(outdata);
 }
diff --git a/test/get-all-nodes.c b/test/get-all-nodes.c
index 152184c6..33adb9a3 100644
--- a/test/get-all-nodes.c
+++ b/test/get-all-nodes.c
@@ -77,6 +77,8 @@ int main(void) {
 
 			assert(meshlink_import(mesh[j], data));
 		}
+
+		free(data);
 	}
 
 	// We should know about all nodes now, and their device class.
diff --git a/test/storage-policy.c b/test/storage-policy.c
index ed78334b..a9aa5f49 100644
--- a/test/storage-policy.c
+++ b/test/storage-policy.c
@@ -207,4 +207,5 @@ int main(void) {
 	// Done.
 
 	close_meshlink_pair(mesh1, mesh2);
+	free(invitation);
 }
-- 
2.39.5