changeset 19807:b0bdbb90ec7f

doveadm: Fixed memory leaks when ver2 command parsing fails with invalid parameter.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 22 Feb 2016 18:42:10 +0200
parents c943b68cda91
children 5e70b4f48909
files src/doveadm/doveadm-mail.c
diffstat 1 files changed, 9 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/doveadm/doveadm-mail.c	Mon Feb 22 13:59:14 2016 +0200
+++ b/src/doveadm/doveadm-mail.c	Mon Feb 22 18:42:10 2016 +0200
@@ -596,12 +596,16 @@
 	/* service deinit unloads mail plugins, so do it late */
 	mail_storage_service_deinit(&ctx->storage_service);
 
+	if (ctx->exit_code != 0)
+		doveadm_exit_code = ctx->exit_code;
+}
+
+static void doveadm_mail_cmd_free(struct doveadm_mail_cmd_context *ctx)
+{
 	if (ctx->users_list_input != NULL)
 		i_stream_unref(&ctx->users_list_input);
 	if (ctx->cmd_input != NULL)
 		i_stream_unref(&ctx->cmd_input);
-	if (ctx->exit_code != 0)
-		doveadm_exit_code = ctx->exit_code;
 	pool_unref(&ctx->pool);
 }
 
@@ -662,6 +666,7 @@
 	}
 	ctx->args = (const void *)argv;
 	doveadm_mail_cmd_exec(ctx, wildcard_user);
+	doveadm_mail_cmd_free(ctx);
 }
 
 static bool
@@ -939,6 +944,7 @@
 		} else {
 			doveadm_exit_code = EX_USAGE;
 			i_error("invalid parameter: %s", argv[i].name);
+			doveadm_mail_cmd_free(ctx);
 			return -1;
 		}
 	}
@@ -948,5 +954,6 @@
 	ctx->full_args = ctx->args;
 
 	doveadm_mail_cmd_exec(ctx, wildcard_user);
+	doveadm_mail_cmd_free(ctx);
 	return 0;
 }