]> 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>
Tue, 12 Jun 2018 15:13:24 +0000 (18:13 +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 83895d539779b48ce8deceddb4c9f710853f25bc..eda298151a79a91dbf37495d947deb83b161a712 100644 (file)
@@ -122,12 +122,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);
 }
@@ -184,7 +187,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
@@ -831,7 +834,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;
 }
 
@@ -1001,7 +1004,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;
@@ -1061,7 +1064,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 85c4ee4a6d3af1c6f8d29eb45aa8a07130a2f199..291f7df9fbdc1290c8d99fb898f78518a2523780 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. */