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;
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");
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)
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;
break;
case '?':
case ':':
+ doveadm_cmd_params_clean(&pargv);
return -1;
default:
// hunt the option
}
if (!found) {
i_error("Extraneous arguments found");
+ doveadm_cmd_params_clean(&pargv);
return -1;
}
}
// 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(¶m->value.v_istream);
- }
+ doveadm_cmd_params_clean(&pargv);
return 0;
}
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;