Skip to content

Commit

Permalink
doveadm: Free istream parameters everywhere
Browse files Browse the repository at this point in the history
Based on patch by Aki Tuomi
  • Loading branch information
sirainen committed Feb 22, 2016
1 parent e6e5687 commit 1e8a6a8
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 7 deletions.
4 changes: 3 additions & 1 deletion src/doveadm/client-connection-http.c
Expand Up @@ -374,7 +374,7 @@ doveadm_http_server_read_request(struct client_connection_http *conn)
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;
Expand Down Expand Up @@ -462,6 +462,8 @@ doveadm_http_server_read_request(struct client_connection_http *conn)
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");
Expand Down
22 changes: 16 additions & 6 deletions src/doveadm/doveadm-cmd.c
Expand Up @@ -243,6 +243,18 @@ bool doveadm_cmd_param_istream(int argc, struct doveadm_cmd_param* params, const
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)
Expand Down Expand Up @@ -366,7 +378,7 @@ bool doveadm_cmd_try_run_ver2(const char *cmd_name, int argc, const char *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;
Expand Down Expand Up @@ -395,6 +407,7 @@ int doveadm_cmd_run_ver2(const struct doveadm_cmd_ver2 *cmd, int argc, const cha
break;
case '?':
case ':':
doveadm_cmd_params_clean(&pargv);
return -1;
default:
// hunt the option
Expand Down Expand Up @@ -423,6 +436,7 @@ int doveadm_cmd_run_ver2(const struct doveadm_cmd_ver2 *cmd, int argc, const cha
}
if (!found) {
i_error("Extraneous arguments found");
doveadm_cmd_params_clean(&pargv);
return -1;
}
}
Expand All @@ -432,10 +446,6 @@ int doveadm_cmd_run_ver2(const struct doveadm_cmd_ver2 *cmd, int argc, const cha
// 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;
}
2 changes: 2 additions & 0 deletions src/doveadm/doveadm-cmd.h
Expand Up @@ -113,6 +113,8 @@ bool doveadm_cmd_param_str(int argc, const struct doveadm_cmd_param* params, con
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;
Expand Down

0 comments on commit 1e8a6a8

Please sign in to comment.