From: Timo Sirainen Date: Mon, 3 May 2004 14:37:48 +0000 (+0300) Subject: memory leak fixes X-Git-Tag: 1.1.alpha1~4139 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ee246b46953e4b94b2f22e093373674fa9155500;p=thirdparty%2Fdovecot%2Fcore.git memory leak fixes --HG-- branch : HEAD --- diff --git a/src/imap/main.c b/src/imap/main.c index 0934414e93..eae9a61e7c 100644 --- a/src/imap/main.c +++ b/src/imap/main.c @@ -153,6 +153,8 @@ static void main_deinit(void) random_deinit(); pool_unref(namespace_pool); + str_free(capability_string); + closelog(); } diff --git a/src/lib-index/mail-index.c b/src/lib-index/mail-index.c index e012063042..036fc2c700 100644 --- a/src/lib-index/mail-index.c +++ b/src/lib-index/mail-index.c @@ -30,6 +30,8 @@ struct mail_index *mail_index_alloc(const char *dir, const char *prefix) void mail_index_free(struct mail_index *index) { + mail_index_close(index); + i_free(index->error); i_free(index->dir); i_free(index->prefix); @@ -564,6 +566,8 @@ int mail_index_open(struct mail_index *index, enum mail_index_open_flags flags) if (index->opened) return 0; + index->filepath = i_strconcat(index->dir, "/", index->prefix, NULL); + do { index->shared_lock_count = 0; index->excl_lock_count = 0; @@ -580,8 +584,6 @@ int mail_index_open(struct mail_index *index, enum mail_index_open_flags flags) (flags & MAIL_INDEX_OPEN_FLAG_FCNTL_LOCKS_DISABLE) != 0; index->readonly = FALSE; - index->filepath = i_strconcat(index->dir, "/", - index->prefix, NULL); ret = mail_index_open_files(index, flags); if (ret <= 0) break; diff --git a/src/lib-index/mail-transaction-log.c b/src/lib-index/mail-transaction-log.c index 070d5a171d..dbb7ab0beb 100644 --- a/src/lib-index/mail-transaction-log.c +++ b/src/lib-index/mail-transaction-log.c @@ -130,6 +130,9 @@ void mail_transaction_log_close(struct mail_transaction_log *log) { mail_transaction_log_views_close(log); + log->head->refcount--; + mail_transaction_logs_clean(log); + log->index->log = NULL; i_free(log); } @@ -222,6 +225,17 @@ mail_transaction_log_file_lock(struct mail_transaction_log_file *file, static void mail_transaction_log_file_close(struct mail_transaction_log_file *file) { + if (file->buffer != NULL) + buffer_free(file->buffer); + + if (file->mmap_base != NULL) { + if (munmap(file->mmap_base, file->mmap_size) < 0) { + mail_index_file_set_syscall_error(file->log->index, + file->filepath, + "munmap()"); + } + } + if (close(file->fd) < 0) { mail_index_file_set_syscall_error(file->log->index, file->filepath, "close()"); diff --git a/src/lib-storage/index/index-storage.c b/src/lib-storage/index/index-storage.c index 2eb703ec1c..66ebbe93c2 100644 --- a/src/lib-storage/index/index-storage.c +++ b/src/lib-storage/index/index-storage.c @@ -362,9 +362,8 @@ void index_storage_mailbox_free(struct mailbox *box) { struct index_mailbox *ibox = (struct index_mailbox *) box; - /* make sure we're unlocked */ if (ibox->view != NULL) - mail_index_view_unlock(ibox->view); + mail_index_view_close(ibox->view); index_mailbox_check_remove_all(ibox); if (ibox->index != NULL)