dovecot-2.2-pigeonhole: doveadm-sieve: Fixed timeout leaks occur...
pigeonhole at rename-it.nl
pigeonhole at rename-it.nl
Mon Oct 27 23:54:27 UTC 2014
details: http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/68c7a4bdea66
changeset: 1939:68c7a4bdea66
user: Stephan Bosch <stephan at rename-it.nl>
date: Tue Oct 28 00:54:15 2014 +0100
description:
doveadm-sieve: Fixed timeout leaks occuring while running doveadm.
This was caused by a circular reference.
diffstat:
src/lib-sieve/sieve-script.c | 6 +-
src/lib-sieve/sieve-storage-private.h | 12 +-
src/lib-sieve/sieve-storage-sync.c | 148 +++++++++++++++++++--------------
src/lib-sieve/sieve-storage.c | 6 +-
4 files changed, 99 insertions(+), 73 deletions(-)
diffs (truncated from 324 to 300 lines):
diff -r 79d66ccc9bfc -r 68c7a4bdea66 src/lib-sieve/sieve-script.c
--- a/src/lib-sieve/sieve-script.c Mon Oct 27 21:58:13 2014 +0100
+++ b/src/lib-sieve/sieve-script.c Tue Oct 28 00:54:15 2014 +0100
@@ -478,7 +478,7 @@
/* rename INBOX mailbox attribute */
if ( ret >= 0 && oldname != NULL )
- sieve_storage_sync_script_rename(storage, oldname, newname);
+ (void)sieve_storage_sync_script_rename(storage, oldname, newname);
return ret;
}
@@ -504,7 +504,7 @@
/* unset INBOX mailbox attribute */
if ( ret >= 0 )
- sieve_storage_sync_script_delete(storage, script->name);
+ (void)sieve_storage_sync_script_delete(storage, script->name);
/* Always deinitialize the script object */
sieve_script_unref(_script);
@@ -531,7 +531,7 @@
if (ret >= 0) {
sieve_storage_set_modified(storage, mtime);
- sieve_storage_sync_script_activate(storage);
+ (void)sieve_storage_sync_script_activate(storage);
}
return ret;
diff -r 79d66ccc9bfc -r 68c7a4bdea66 src/lib-sieve/sieve-storage-private.h
--- a/src/lib-sieve/sieve-storage-private.h Mon Oct 27 21:58:13 2014 +0100
+++ b/src/lib-sieve/sieve-storage-private.h Tue Oct 28 00:54:15 2014 +0100
@@ -109,7 +109,7 @@
const char *script_name;
const char *bin_dir;
- struct mailbox *sync_inbox;
+ struct mail_namespace *sync_inbox_ns;
enum sieve_storage_flags flags;
@@ -235,17 +235,17 @@
void sieve_storage_sync_deinit
(struct sieve_storage *storage);
-void sieve_storage_sync_script_save
+int sieve_storage_sync_script_save
(struct sieve_storage *storage, const char *name);
-void sieve_storage_sync_script_rename
+int sieve_storage_sync_script_rename
(struct sieve_storage *storage, const char *oldname,
const char *newname);
-void sieve_storage_sync_script_delete
+int sieve_storage_sync_script_delete
(struct sieve_storage *storage, const char *name);
-void sieve_storage_sync_script_activate
+int sieve_storage_sync_script_activate
(struct sieve_storage *storage);
-void sieve_storage_sync_deactivate
+int sieve_storage_sync_deactivate
(struct sieve_storage *storage);
diff -r 79d66ccc9bfc -r 68c7a4bdea66 src/lib-sieve/sieve-storage-sync.c
--- a/src/lib-sieve/sieve-storage-sync.c Mon Oct 27 21:58:13 2014 +0100
+++ b/src/lib-sieve/sieve-storage-sync.c Tue Oct 28 00:54:15 2014 +0100
@@ -24,11 +24,7 @@
int sieve_storage_sync_init
(struct sieve_storage *storage, struct mail_user *user)
{
- struct mail_namespace *ns;
- struct mailbox *box;
enum sieve_storage_flags sflags = storage->flags;
- enum mailbox_flags mflags = MAILBOX_FLAG_IGNORE_ACLS;
- enum mail_error error;
if ( (sflags & SIEVE_STORAGE_FLAG_SYNCHRONIZING) == 0 &&
(sflags & SIEVE_STORAGE_FLAG_READWRITE) == 0 )
@@ -41,126 +37,156 @@
}
sieve_storage_sys_debug(storage, "sync: "
- "Opening INBOX for attribute modifications");
+ "Synchronization active");
- ns = mail_namespace_find_inbox(user->namespaces);
- storage->sync_inbox = box = mailbox_alloc(ns->list, "INBOX", mflags);
- if (mailbox_open(box) == 0)
- return 0;
-
- sieve_storage_sys_warning(storage, "sync: "
- "Failed to open user INBOX for attribute modifications: %s",
- mailbox_get_last_error(box, &error));
- return -1;
+ storage->sync_inbox_ns = mail_namespace_find_inbox(user->namespaces);
+ return 0;
}
void sieve_storage_sync_deinit
-(struct sieve_storage *storage)
+(struct sieve_storage *storage ATTR_UNUSED)
{
- if (storage->sync_inbox != NULL)
- mailbox_free(&storage->sync_inbox);
+ /* nothing */
}
/*
* Sync attributes
*/
-static void sieve_storage_sync_transaction_finish
-(struct sieve_storage *storage, struct mailbox_transaction_context **t)
+static int sieve_storage_sync_transaction_begin
+(struct sieve_storage *storage, struct mailbox_transaction_context **trans_r)
{
- struct mailbox *inbox = storage->sync_inbox;
+ enum mailbox_flags mflags = MAILBOX_FLAG_IGNORE_ACLS;
+ struct mail_namespace *ns = storage->sync_inbox_ns;
+ struct mailbox *inbox;
+ enum mail_error error;
- i_assert( storage->sync_inbox != NULL );
+ if (ns == NULL)
+ return 0;
- if (mailbox_transaction_commit(t) < 0) {
+ inbox = mailbox_alloc(ns->list, "INBOX", mflags);
+ if (mailbox_open(inbox) < 0) {
+ sieve_storage_sys_warning(storage, "sync: "
+ "Failed to open user INBOX for attribute modifications: %s",
+ mailbox_get_last_error(inbox, &error));
+ return -1;
+ }
+
+ *trans_r = mailbox_transaction_begin(inbox, 0);
+ return 1;
+}
+
+static int sieve_storage_sync_transaction_finish
+(struct sieve_storage *storage, struct mailbox_transaction_context **trans)
+{
+ struct mailbox *inbox;
+ int ret;
+
+ inbox = mailbox_transaction_get_mailbox(*trans);
+
+ if ((ret=mailbox_transaction_commit(trans)) < 0) {
enum mail_error error;
sieve_storage_sys_warning(storage, "sync: "
"Failed to update INBOX attributes: %s",
mail_storage_get_last_error(mailbox_get_storage(inbox), &error));
}
+
+ mailbox_free(&inbox);
+ return ret;
}
-void sieve_storage_sync_script_save
+int sieve_storage_sync_script_save
(struct sieve_storage *storage, const char *name)
{
- struct mailbox_transaction_context *t;
+ struct mailbox_transaction_context *trans;
const char *key;
+ int ret;
- if (storage->sync_inbox == NULL)
- return;
+ if ((ret=sieve_storage_sync_transaction_begin
+ (storage, &trans)) <= 0)
+ return ret;
key = t_strconcat
(MAILBOX_ATTRIBUTE_PREFIX_SIEVE_FILES, name, NULL);
- t = mailbox_transaction_begin(storage->sync_inbox, 0);
- mail_index_attribute_set(t->itrans, TRUE, key, ioloop_time, 0);
- sieve_storage_sync_transaction_finish(storage, &t);
+
+ mail_index_attribute_set(trans->itrans, TRUE, key, ioloop_time, 0);
+
+ return sieve_storage_sync_transaction_finish(storage, &trans);
}
-void sieve_storage_sync_script_rename
+int sieve_storage_sync_script_rename
(struct sieve_storage *storage, const char *oldname,
const char *newname)
{
- struct mailbox_transaction_context *t;
+ struct mailbox_transaction_context *trans;
const char *oldkey, *newkey;
+ int ret;
- if (storage->sync_inbox == NULL)
- return;
+ if ((ret=sieve_storage_sync_transaction_begin
+ (storage, &trans)) <= 0)
+ return ret;
oldkey = t_strconcat
(MAILBOX_ATTRIBUTE_PREFIX_SIEVE_FILES, oldname, NULL);
newkey = t_strconcat
(MAILBOX_ATTRIBUTE_PREFIX_SIEVE_FILES, newname, NULL);
- t = mailbox_transaction_begin(storage->sync_inbox, 0);
- mail_index_attribute_unset(t->itrans, TRUE, oldkey, ioloop_time);
- mail_index_attribute_set(t->itrans, TRUE, newkey, ioloop_time, 0);
- sieve_storage_sync_transaction_finish(storage, &t);
+ mail_index_attribute_unset(trans->itrans, TRUE, oldkey, ioloop_time);
+ mail_index_attribute_set(trans->itrans, TRUE, newkey, ioloop_time, 0);
+
+ return sieve_storage_sync_transaction_finish(storage, &trans);
}
-void sieve_storage_sync_script_delete
+int sieve_storage_sync_script_delete
(struct sieve_storage *storage, const char *name)
{
- struct mailbox_transaction_context *t;
+ struct mailbox_transaction_context *trans;
const char *key;
+ int ret;
- if (storage->sync_inbox == NULL)
- return;
+ if ((ret=sieve_storage_sync_transaction_begin
+ (storage, &trans)) <= 0)
+ return ret;
key = t_strconcat
(MAILBOX_ATTRIBUTE_PREFIX_SIEVE_FILES, name, NULL);
-
- t = mailbox_transaction_begin(storage->sync_inbox, 0);
- mail_index_attribute_unset(t->itrans, TRUE, key, ioloop_time);
- sieve_storage_sync_transaction_finish(storage, &t);
+
+ mail_index_attribute_unset(trans->itrans, TRUE, key, ioloop_time);
+
+ return sieve_storage_sync_transaction_finish(storage, &trans);
}
-void sieve_storage_sync_script_activate
+int sieve_storage_sync_script_activate
(struct sieve_storage *storage)
{
- struct mailbox_transaction_context *t;
+ struct mailbox_transaction_context *trans;
+ int ret;
- if (storage->sync_inbox == NULL)
- return;
+ if ((ret=sieve_storage_sync_transaction_begin
+ (storage, &trans)) <= 0)
+ return ret;
- t = mailbox_transaction_begin(storage->sync_inbox, 0);
- mail_index_attribute_set
- (t->itrans, TRUE, MAILBOX_ATTRIBUTE_SIEVE_DEFAULT, ioloop_time, 0);
- sieve_storage_sync_transaction_finish(storage, &t);
+ mail_index_attribute_set(trans->itrans,
+ TRUE, MAILBOX_ATTRIBUTE_SIEVE_DEFAULT, ioloop_time, 0);
+
+ return sieve_storage_sync_transaction_finish(storage, &trans);
}
-void sieve_storage_sync_deactivate
+int sieve_storage_sync_deactivate
(struct sieve_storage *storage)
{
- struct mailbox_transaction_context *t;
+ struct mailbox_transaction_context *trans;
+ int ret;
- if (storage->sync_inbox == NULL)
- return;
+ if ((ret=sieve_storage_sync_transaction_begin
+ (storage, &trans)) <= 0)
+ return ret;
- t = mailbox_transaction_begin(storage->sync_inbox, 0);
- mail_index_attribute_unset
- (t->itrans, TRUE, MAILBOX_ATTRIBUTE_SIEVE_DEFAULT, ioloop_time);
- sieve_storage_sync_transaction_finish(storage, &t);
+ mail_index_attribute_unset(trans->itrans,
+ TRUE, MAILBOX_ATTRIBUTE_SIEVE_DEFAULT, ioloop_time);
+
+ return sieve_storage_sync_transaction_finish(storage, &trans);
}
diff -r 79d66ccc9bfc -r 68c7a4bdea66 src/lib-sieve/sieve-storage.c
--- a/src/lib-sieve/sieve-storage.c Mon Oct 27 21:58:13 2014 +0100
+++ b/src/lib-sieve/sieve-storage.c Tue Oct 28 00:54:15 2014 +0100
@@ -482,7 +482,7 @@
if (--storage->refcount != 0)
return;
More information about the dovecot-cvs
mailing list