dovecot-2.2: imapc: Abort pending commands before any deinitiali...
dovecot at dovecot.org
dovecot at dovecot.org
Thu Sep 19 22:21:15 EEST 2013
details: http://hg.dovecot.org/dovecot-2.2/rev/827ebbf9da5f
changeset: 16769:827ebbf9da5f
user: Timo Sirainen <tss at iki.fi>
date: Thu Sep 19 22:20:56 2013 +0300
description:
imapc: Abort pending commands before any deinitialization to avoid crashes.
diffstat:
src/lib-imap-client/imapc-client.c | 24 +++++++++++++++++-------
src/lib-imap-client/imapc-client.h | 1 +
src/lib-storage/index/imapc/imapc-list.c | 6 +++++-
src/lib-storage/index/imapc/imapc-storage.c | 4 ++++
4 files changed, 27 insertions(+), 8 deletions(-)
diffs (84 lines):
diff -r b92118278b06 -r 827ebbf9da5f src/lib-imap-client/imapc-client.c
--- a/src/lib-imap-client/imapc-client.c Wed Sep 18 23:24:30 2013 +0300
+++ b/src/lib-imap-client/imapc-client.c Thu Sep 19 22:20:56 2013 +0300
@@ -110,17 +110,27 @@
pool_unref(&client->pool);
}
+void imapc_client_disconnect(struct imapc_client *client)
+{
+ struct imapc_client_connection *const *conns, *conn;
+ unsigned int i, count;
+
+ conns = array_get(&client->conns, &count);
+ for (i = count; i > 0; i--) {
+ conn = conns[i-1];
+ array_delete(&client->conns, i-1, 1);
+
+ i_assert(imapc_connection_get_mailbox(conn->conn) == NULL);
+ imapc_connection_deinit(&conn->conn);
+ i_free(conn);
+ }
+}
+
void imapc_client_deinit(struct imapc_client **_client)
{
struct imapc_client *client = *_client;
- struct imapc_client_connection **connp;
- array_foreach_modifiable(&client->conns, connp) {
- i_assert(imapc_connection_get_mailbox((*connp)->conn) == NULL);
- imapc_connection_deinit(&(*connp)->conn);
- i_free(*connp);
- }
- array_clear(&client->conns);
+ imapc_client_disconnect(client);
imapc_client_unref(_client);
}
diff -r b92118278b06 -r 827ebbf9da5f src/lib-imap-client/imapc-client.h
--- a/src/lib-imap-client/imapc-client.h Wed Sep 18 23:24:30 2013 +0300
+++ b/src/lib-imap-client/imapc-client.h Thu Sep 19 22:20:56 2013 +0300
@@ -134,6 +134,7 @@
struct imapc_client *
imapc_client_init(const struct imapc_client_settings *set);
+void imapc_client_disconnect(struct imapc_client *client);
void imapc_client_deinit(struct imapc_client **client);
/* Explicitly login to server (also done automatically). */
diff -r b92118278b06 -r 827ebbf9da5f src/lib-storage/index/imapc/imapc-list.c
--- a/src/lib-storage/index/imapc/imapc-list.c Wed Sep 18 23:24:30 2013 +0300
+++ b/src/lib-storage/index/imapc/imapc-list.c Thu Sep 19 22:20:56 2013 +0300
@@ -98,12 +98,16 @@
{
struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
+ /* make sure all pending commands are aborted before anything is
+ deinitialized */
+ imapc_client_disconnect(list->client->client);
+
+ imapc_storage_client_unref(&list->client);
if (list->index_list != NULL)
mailbox_list_destroy(&list->index_list);
mailbox_tree_deinit(&list->mailboxes);
if (list->tmp_subscriptions != NULL)
mailbox_tree_deinit(&list->tmp_subscriptions);
- imapc_storage_client_unref(&list->client);
pool_unref(&list->list.pool);
}
diff -r b92118278b06 -r 827ebbf9da5f src/lib-storage/index/imapc/imapc-storage.c
--- a/src/lib-storage/index/imapc/imapc-storage.c Wed Sep 18 23:24:30 2013 +0300
+++ b/src/lib-storage/index/imapc/imapc-storage.c Thu Sep 19 22:20:56 2013 +0300
@@ -295,6 +295,10 @@
{
struct imapc_storage *storage = (struct imapc_storage *)_storage;
+ /* make sure all pending commands are aborted before anything is
+ deinitialized */
+ imapc_client_disconnect(storage->client->client);
+
imapc_storage_client_unref(&storage->client);
index_storage_destroy(_storage);
}
More information about the dovecot-cvs
mailing list