changeset 19826:4d0c03e449e2

doveadm: Free istream parameters everywhere Based on patch by Aki Tuomi
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 22 Feb 2016 21:39:06 +0200
parents e3ea9a323caf
children 272388892bc3
files src/doveadm/client-connection-http.c src/doveadm/doveadm-cmd.c src/doveadm/doveadm-cmd.h
diffstat 3 files changed, 21 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/doveadm/client-connection-http.c	Mon Feb 22 14:03:41 2016 +0200
+++ b/src/doveadm/client-connection-http.c	Mon Feb 22 21:39:06 2016 +0200
@@ -374,7 +374,7 @@
 			conn->method_err = 0;
 			p_free_and_null(conn->client.pool, conn->method_id);
 			conn->cmd = NULL;
-			array_clear(&conn->pargv);
+			doveadm_cmd_params_clean(&conn->pargv);
 			conn->json_state = JSON_STATE_COMMAND_NAME;
 		} else if (conn->json_state == JSON_STATE_COMMAND_NAME) {
 			if (type != JSON_TYPE_STRING) break;
@@ -462,6 +462,8 @@
 		return;
 	io_remove(&conn->client.io);
 
+	doveadm_cmd_params_clean(&conn->pargv);
+
 	if (rc == -2 || (rc == 1 && conn->json_state != JSON_STATE_DONE)) {
 		/* this will happen if the parser above runs into unexpected element, but JSON is OK */
 		http_server_request_fail_close(conn->http_server_request, 400, "Unexpected element in input");
--- a/src/doveadm/doveadm-cmd.c	Mon Feb 22 14:03:41 2016 +0200
+++ b/src/doveadm/doveadm-cmd.c	Mon Feb 22 21:39:06 2016 +0200
@@ -243,6 +243,18 @@
 	return FALSE;
 }
 
+void doveadm_cmd_params_clean(ARRAY_TYPE(doveadm_cmd_param_arr_t) *pargv)
+{
+	struct doveadm_cmd_param *param;
+
+	array_foreach_modifiable(pargv, param) {
+		if (param->type == CMD_PARAM_ISTREAM &&
+		    param->value.v_istream != NULL)
+			i_stream_destroy(&(param->value.v_istream));
+	}
+	array_clear(pargv);
+}
+
 static void
 doveadm_cmd_params_to_argv(const char *name, int pargc, const struct doveadm_cmd_param* params,
 	ARRAY_TYPE(const_string) *argv)
@@ -366,7 +378,7 @@
 int doveadm_cmd_run_ver2(const struct doveadm_cmd_ver2 *cmd, int argc, const char *argv[])
 {
 	struct doveadm_cmd_param *param;
-	ARRAY(struct doveadm_cmd_param) pargv;
+	ARRAY_TYPE(doveadm_cmd_param_arr_t) pargv;
 	ARRAY_TYPE(getopt_option_array) opts;
 	const char *cptr;
 	unsigned int pargc;
@@ -395,6 +407,7 @@
 			break;
 		case '?':
 		case ':':
+			doveadm_cmd_params_clean(&pargv);
 			return -1;
 		default:
 			// hunt the option
@@ -423,6 +436,7 @@
 		}
 		if (!found) {
 			i_error("Extraneous arguments found");
+			doveadm_cmd_params_clean(&pargv);
 			return -1;
 		}
 	}
@@ -432,10 +446,6 @@
 	// FIXME: Unsure what do to with return value
 	cmd->cmd(cmd, pargc, param);
 
-	// unref istreams
-	array_foreach_modifiable(&pargv, param) {
-		if (param->type == CMD_PARAM_ISTREAM && param->value.v_istream != NULL)
-			i_stream_unref(&param->value.v_istream);
-	}
+	doveadm_cmd_params_clean(&pargv);
 	return 0;
 }
--- a/src/doveadm/doveadm-cmd.h	Mon Feb 22 14:03:41 2016 +0200
+++ b/src/doveadm/doveadm-cmd.h	Mon Feb 22 21:39:06 2016 +0200
@@ -113,6 +113,8 @@
 bool doveadm_cmd_param_array(int argc, struct doveadm_cmd_param* params, const char *name, ARRAY_TYPE(const_string)** value);
 bool doveadm_cmd_param_istream(int argc, struct doveadm_cmd_param* params, const char *name, struct istream** value);
 
+void doveadm_cmd_params_clean(ARRAY_TYPE(doveadm_cmd_param_arr_t) *pargv);
+
 extern struct doveadm_cmd_ver2 doveadm_cmd_stop_ver2;
 extern struct doveadm_cmd_ver2 doveadm_cmd_reload_ver2;
 extern struct doveadm_cmd_ver2 doveadm_cmd_stats_reset_ver2;