changeset 21022:fe1a8662a64b

doveadm director: Fix memory leaks if hostname lookup fails.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 31 Oct 2016 21:39:44 +0200
parents bda524026533
children e117f596cdea
files src/doveadm/doveadm-director.c
diffstat 1 files changed, 19 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/doveadm/doveadm-director.c	Tue Nov 01 17:09:27 2016 +0200
+++ b/src/doveadm/doveadm-director.c	Mon Oct 31 21:39:44 2016 +0200
@@ -350,8 +350,10 @@
 
 	if (ctx->host == NULL || ctx->hash_map)
 		ips_count = 0;
-	else
-		if (director_get_host(ctx->host, &ips, &ips_count) != 0) return;
+	else if (director_get_host(ctx->host, &ips, &ips_count) != 0) {
+		director_disconnect(ctx);
+		return;
+	}
 
 	pool = pool_alloconly_create("director map users", 1024*128);
 	hash_table_create_direct(&users, pool, 0);
@@ -458,7 +460,10 @@
 		if (ctx->tag != NULL)
 			host = t_strdup_until(ctx->host, ctx->tag++);
 	}
-	if (director_get_host(host, &ips, &ips_count) != 0) return;
+	if (director_get_host(host, &ips, &ips_count) != 0) {
+		director_disconnect(ctx);
+		return;
+	}
 	cmd = t_str_new(128);
 	for (i = 0; i < ips_count; i++) {
 		str_truncate(cmd, 0);
@@ -511,7 +516,10 @@
 		return;
 	}
 
-	if (director_get_host(host, &ips, &ips_count) != 0) return;
+	if (director_get_host(host, &ips, &ips_count) != 0) {
+		director_disconnect(ctx);
+		return;
+	}
 	for (i = 0; i < ips_count; i++) {
 		director_send(ctx, t_strdup_printf(
 			"%s\t%s\n", cmd_name, net_ip2addr(&ips[i])));
@@ -564,7 +572,10 @@
 
 	user_hash = mail_user_hash(ctx->user, doveadm_settings->director_username_hash);
 
-	if (director_get_host(ctx->host, &ips, &ips_count) != 0) return;
+	if (director_get_host(ctx->host, &ips, &ips_count) != 0) {
+		director_disconnect(ctx);
+		return;
+	}
 	ip_str = net_ip2addr(&ips[0]);
 	director_send(ctx, t_strdup_printf(
 		"USER-MOVE\t%u\t%s\n", user_hash, ip_str));
@@ -676,8 +687,9 @@
 	if (net_addr2ip(ctx->host, &ip) == 0) {
 		ips = &ip;
 		ips_count = 1;
-	} else {
-		if (director_get_host(ctx->host, &ips, &ips_count) != 0) return;
+	} else if (director_get_host(ctx->host, &ips, &ips_count) != 0) {
+		director_disconnect(ctx);
+		return;
 	}
 
 	cmd = t_str_new(64);