]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Fix leaking memory when sending imapc commands after authentication failure
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 12 Jun 2018 13:45:26 +0000 (16:45 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 22 Aug 2018 09:44:08 +0000 (12:44 +0300)
src/lib-storage/index/imapc/imapc-list.c
src/lib-storage/index/imapc/imapc-storage.c
src/lib-storage/index/imapc/imapc-storage.h
src/plugins/quota/quota-imapc.c

index 5c555a0ca91d4276a1f80c356d7fbb83184ac808..47c3355395ca4e435c35a81ac949ec7551bcc7e6 100644 (file)
@@ -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
@@ -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;
@@ -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;
 }
 
@@ -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);
@@ -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);
index 7b4a5c9f30e74d22832bb24e976600149116cff8..81da12305347cf787e9993f0f88b210a995f0c86 100644 (file)
@@ -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);
 }
@@ -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
@@ -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;
 }
 
@@ -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;
@@ -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;
index d23a90b2d476f41bba8c2854263f41ab470ab930..10d1ea4e2ad5d3672b7d5ed8777d6384375205b7 100644 (file)
@@ -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,
index 59a11726b2cd91fbe3c00c596c3f79bd8db452ea..f75fa09cd90cbdcb0443eecd26afa2e9e63a089c 100644 (file)
@@ -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 */
@@ -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. */