Skip to content

Commit

Permalink
imapc: Fix leaking memory when sending imapc commands after authentic…
Browse files Browse the repository at this point in the history
…ation failure
  • Loading branch information
sirainen committed Aug 22, 2018
1 parent efdd302 commit 413dfa5
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 14 deletions.
12 changes: 6 additions & 6 deletions src/lib-storage/index/imapc/imapc-list.c
Expand Up @@ -569,7 +569,7 @@ static int imapc_list_refresh(struct imapc_mailbox_list *list)
mailbox_tree_deinit(&list->mailboxes);
list->mailboxes = mailbox_tree_init(mail_namespace_get_sep(list->list.ns));
mailbox_tree_set_parents_nonexistent(list->mailboxes);
imapc_simple_run(&ctx);
imapc_simple_run(&ctx, &cmd);

if ((list->list.ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0) {
/* INBOX always exists in IMAP server. since this namespace is
Expand Down Expand Up @@ -803,7 +803,7 @@ imapc_list_subscriptions_refresh(struct mailbox_list *_src_list,
pattern = t_strdup_printf("%s*", src_list->set->imapc_list_prefix);
imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_RETRIABLE);
imapc_command_sendf(cmd, "LSUB \"\" %s", pattern);
imapc_simple_run(&ctx);
imapc_simple_run(&ctx, &cmd);

if (ctx.ret < 0)
return -1;
Expand All @@ -830,7 +830,7 @@ static int imapc_list_set_subscribed(struct mailbox_list *_list,
imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_RETRIABLE);
imapc_command_sendf(cmd, set ? "SUBSCRIBE %s" : "UNSUBSCRIBE %s",
imapc_list_to_remote(list, name));
imapc_simple_run(&ctx);
imapc_simple_run(&ctx, &cmd);
return ctx.ret;
}

Expand Down Expand Up @@ -858,13 +858,13 @@ imapc_list_delete_mailbox(struct mailbox_list *_list, const char *name)
imapc_command_sendf(cmd, "UNSELECT");
else
imapc_command_sendf(cmd, "SELECT \"~~~\"");
imapc_simple_run(&ctx);
imapc_simple_run(&ctx, &cmd);
}

cmd = imapc_list_simple_context_init(&ctx, list);
imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_RETRIABLE);
imapc_command_sendf(cmd, "DELETE %s", imapc_list_to_remote(list, name));
imapc_simple_run(&ctx);
imapc_simple_run(&ctx, &cmd);

if (fs_list != NULL && ctx.ret == 0) {
name = imapc_list_get_fs_name(list, name);
Expand Down Expand Up @@ -913,7 +913,7 @@ imapc_list_rename_mailbox(struct mailbox_list *oldlist, const char *oldname,
imapc_command_sendf(cmd, "RENAME %s %s",
imapc_list_to_remote(list, oldname),
imapc_list_to_remote(list, newname));
imapc_simple_run(&ctx);
imapc_simple_run(&ctx, &cmd);
if (ctx.ret == 0 && fs_list != NULL && oldlist == newlist) {
oldname = imapc_list_get_fs_name(list, oldname);
newname = imapc_list_get_fs_name(list, newname);
Expand Down
13 changes: 8 additions & 5 deletions src/lib-storage/index/imapc/imapc-storage.c
Expand Up @@ -117,12 +117,15 @@ void imapc_simple_context_init(struct imapc_simple_context *sctx,
sctx->ret = -2;
}

void imapc_simple_run(struct imapc_simple_context *sctx)
void imapc_simple_run(struct imapc_simple_context *sctx,
struct imapc_command **cmd)
{
if (imapc_storage_client_handle_auth_failure(sctx->client)) {
imapc_command_abort(cmd);
imapc_client_logout(sctx->client->client);
sctx->ret = -1;
}
*cmd = NULL;
while (sctx->ret == -2)
imapc_client_run(sctx->client->client);
}
Expand Down Expand Up @@ -179,7 +182,7 @@ void imapc_mailbox_noop(struct imapc_mailbox *mbox)
cmd = imapc_client_mailbox_cmd(mbox->client_box,
imapc_simple_callback, &sctx);
imapc_command_send(cmd, "NOOP");
imapc_simple_run(&sctx);
imapc_simple_run(&sctx, &cmd);
}

static void
Expand Down Expand Up @@ -835,7 +838,7 @@ imapc_mailbox_create(struct mailbox *box,
cmd = imapc_client_cmd(mbox->storage->client->client,
imapc_simple_callback, &sctx);
imapc_command_sendf(cmd, "CREATE %s", name);
imapc_simple_run(&sctx);
imapc_simple_run(&sctx, &cmd);
return sctx.ret;
}

Expand Down Expand Up @@ -1005,7 +1008,7 @@ static int imapc_mailbox_run_status(struct mailbox *box,
imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_RETRIABLE);
imapc_command_sendf(cmd, "STATUS %s (%1s)",
imapc_mailbox_get_remote_name(mbox), str_c(str)+1);
imapc_simple_run(&sctx);
imapc_simple_run(&sctx, &cmd);
mbox->storage->cur_status_box = NULL;
mbox->storage->cur_status = NULL;
return sctx.ret;
Expand Down Expand Up @@ -1065,7 +1068,7 @@ static int imapc_mailbox_get_namespaces(struct imapc_mailbox *mbox)
imapc_simple_callback, &sctx);
imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_RETRIABLE);
imapc_command_send(cmd, "NAMESPACE");
imapc_simple_run(&sctx);
imapc_simple_run(&sctx, &cmd);

if (sctx.ret < 0)
return -1;
Expand Down
3 changes: 2 additions & 1 deletion src/lib-storage/index/imapc/imapc-storage.h
Expand Up @@ -188,7 +188,8 @@ void imapc_copy_error_from_reply(struct imapc_storage *storage,
const struct imapc_command_reply *reply);
void imapc_simple_context_init(struct imapc_simple_context *sctx,
struct imapc_storage_client *client);
void imapc_simple_run(struct imapc_simple_context *sctx);
void imapc_simple_run(struct imapc_simple_context *sctx,
struct imapc_command **cmd);
void imapc_simple_callback(const struct imapc_command_reply *reply,
void *context);
int imapc_mailbox_commit_delayed_trans(struct imapc_mailbox *mbox,
Expand Down
4 changes: 2 additions & 2 deletions src/plugins/quota/quota-imapc.c
Expand Up @@ -310,7 +310,7 @@ static int imapc_quota_refresh_mailbox(struct imapc_quota_root *root,
cmd = imapc_client_cmd(root->client->client,
imapc_simple_callback, &sctx);
imapc_command_sendf(cmd, "GETQUOTAROOT %s", root->box_name);
imapc_simple_run(&sctx);
imapc_simple_run(&sctx, &cmd);

/* if there are multiple quota roots, use the first one returned by
the QUOTAROOT */
Expand Down Expand Up @@ -342,7 +342,7 @@ static int imapc_quota_refresh_root(struct imapc_quota_root *root,
cmd = imapc_client_cmd(root->client->client,
imapc_simple_callback, &sctx);
imapc_command_sendf(cmd, "GETQUOTA %s", root->root_name);
imapc_simple_run(&sctx);
imapc_simple_run(&sctx, &cmd);

/* there shouldn't be more than one QUOTA reply, but ignore anyway
anything we didn't expect. */
Expand Down

0 comments on commit 413dfa5

Please sign in to comment.