From: Guus Sliepen <guus@tinc-vpn.org>
Date: Fri, 25 Sep 2015 08:06:18 +0000 (+0200)
Subject: Fix a few memory leaks in the CLI found by AddressSanitizer.
X-Git-Tag: release-1.1pre12~92
X-Git-Url: http://git.tinc-vpn.org/git/browse?a=commitdiff_plain;h=73068238436d8a22abb86e67b08f573b09fd04e1;p=tinc

Fix a few memory leaks in the CLI found by AddressSanitizer.
---

diff --git a/src/tincctl.c b/src/tincctl.c
index 00757c47..abc5c095 100644
--- a/src/tincctl.c
+++ b/src/tincctl.c
@@ -417,6 +417,7 @@ static bool ed25519_keygen(bool ask) {
 
 	char *pubkey = ecdsa_get_base64_public_key(key);
 	fprintf(f, "Ed25519PublicKey = %s\n", pubkey);
+	free(pubkey);
 
 	fclose(f);
 	ecdsa_free(key);
@@ -1804,7 +1805,7 @@ static int cmd_config(int argc, char *argv[]) {
 }
 
 static bool try_bind(int port) {
-	struct addrinfo *ai = NULL;
+	struct addrinfo *ai = NULL, *aip;
 	struct addrinfo hint = {
 		.ai_flags = AI_PASSIVE,
 		.ai_family = AF_UNSPEC,
@@ -1812,24 +1813,30 @@ static bool try_bind(int port) {
 		.ai_protocol = IPPROTO_TCP,
 	};
 
+	bool success = true;
 	char portstr[16];
 	snprintf(portstr, sizeof portstr, "%d", port);
 
 	if(getaddrinfo(NULL, portstr, &hint, &ai) || !ai)
 		return false;
 
-	while(ai) {
+	for(aip = ai; aip; aip = aip->ai_next) {
 		int fd = socket(ai->ai_family, SOCK_STREAM, IPPROTO_TCP);
-		if(!fd)
-			return false;
+		if(!fd) {
+			success = false;
+			break;
+		}
+
 		int result = bind(fd, ai->ai_addr, ai->ai_addrlen);
 		closesocket(fd);
-		if(result)
-			return false;
-		ai = ai->ai_next;
+		if(result) {
+			success = false;
+			break;
+		}
 	}
 
-	return true;
+	freeaddrinfo(ai);
+	return success;
 }
 
 int check_port(char *name) {