From: Guus Sliepen <guus@tinc-vpn.org>
Date: Wed, 24 Dec 2014 16:31:33 +0000 (+0100)
Subject: Fix memory leaks found by Valgrind.
X-Git-Tag: release-1.1pre11~15
X-Git-Url: https://tinc-vpn.org/git/browse?a=commitdiff_plain;h=3df86ef17bce9f24c3dad79ccc2b17aa6e93ea34;p=tinc

Fix memory leaks found by Valgrind.
---

diff --git a/src/net_setup.c b/src/net_setup.c
index 0a99daad..a7ed3a89 100644
--- a/src/net_setup.c
+++ b/src/net_setup.c
@@ -1114,7 +1114,7 @@ void close_network_connections(void) {
 	if (!device_standby)
 		device_disable();
 
-	if(myport) free(myport);
+	free(myport);
 
 	if (device_fd >= 0)
 		io_del(&device_io);
@@ -1124,7 +1124,8 @@ void close_network_connections(void) {
 	exit_control();
 
 	free(myname);
-	myname = NULL;
+	free(scriptextension);
+	free(scriptinterpreter);
 
 	return;
 }
diff --git a/src/openssl/crypto.c b/src/openssl/crypto.c
index ed8c8e29..5b866b0b 100644
--- a/src/openssl/crypto.c
+++ b/src/openssl/crypto.c
@@ -99,5 +99,7 @@ void crypto_init(void) {
 
 void crypto_exit(void) {
 	EVP_cleanup();
+	ERR_free_strings();
+	ENGINE_cleanup();
 	random_exit();
 }
diff --git a/src/subnet.c b/src/subnet.c
index 5356f3a7..534e5b53 100644
--- a/src/subnet.c
+++ b/src/subnet.c
@@ -207,21 +207,21 @@ void subnet_update(node_t *owner, subnet_t *subnet, bool up) {
 	// Prepare environment variables to be passed to the script
 
 	char *envp[10] = {NULL};
-	xasprintf(&envp[0], "NETNAME=%s", netname ? : "");
-	xasprintf(&envp[1], "DEVICE=%s", device ? : "");
-	xasprintf(&envp[2], "INTERFACE=%s", iface ? : "");
-	xasprintf(&envp[3], "NODE=%s", owner->name);
+	int n = 0;
+	xasprintf(&envp[n++], "NETNAME=%s", netname ? : "");
+	xasprintf(&envp[n++], "DEVICE=%s", device ? : "");
+	xasprintf(&envp[n++], "INTERFACE=%s", iface ? : "");
+	xasprintf(&envp[n++], "NODE=%s", owner->name);
 
 	if(owner != myself) {
 		sockaddr2str(&owner->address, &address, &port);
-		// 4 and 5 are reserved for SUBNET and WEIGHT
-		xasprintf(&envp[6], "REMOTEADDRESS=%s", address);
-		xasprintf(&envp[7], "REMOTEPORT=%s", port);
+		xasprintf(&envp[n++], "REMOTEADDRESS=%s", address);
+		xasprintf(&envp[n++], "REMOTEPORT=%s", port);
 		free(port);
 		free(address);
 	}
 
-	xasprintf(&envp[8], "NAME=%s", myself->name);
+	xasprintf(&envp[n++], "NAME=%s", myself->name);
 
 	name = up ? "subnet-up" : "subnet-down";
 
@@ -238,12 +238,10 @@ void subnet_update(node_t *owner, subnet_t *subnet, bool up) {
 				weight = empty;
 
 			// Prepare the SUBNET and WEIGHT variables
-			if(envp[4])
-				free(envp[4]);
-			if(envp[5])
-				free(envp[5]);
-			xasprintf(&envp[4], "SUBNET=%s", netstr);
-			xasprintf(&envp[5], "WEIGHT=%s", weight);
+			free(envp[n]);
+			free(envp[n + 1]);
+			xasprintf(&envp[n], "SUBNET=%s", netstr);
+			xasprintf(&envp[n + 1], "WEIGHT=%s", weight);
 
 			execute_script(name, envp);
 		}
@@ -257,8 +255,8 @@ void subnet_update(node_t *owner, subnet_t *subnet, bool up) {
 				weight = empty;
 
 			// Prepare the SUBNET and WEIGHT variables
-			xasprintf(&envp[4], "SUBNET=%s", netstr);
-			xasprintf(&envp[5], "WEIGHT=%s", weight);
+			xasprintf(&envp[n], "SUBNET=%s", netstr);
+			xasprintf(&envp[n + 1], "WEIGHT=%s", weight);
 
 			execute_script(name, envp);
 		}