From: Timo Sirainen Date: Tue, 23 Sep 2003 19:34:34 +0000 (+0300) Subject: Fixes memory/fd leaking with INDEX=MEMORY. X-Git-Tag: 1.1.alpha1~4316 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cd9195a6351716f2dbebe1839423f7d15821956a;p=thirdparty%2Fdovecot%2Fcore.git Fixes memory/fd leaking with INDEX=MEMORY. --HG-- branch : HEAD --- diff --git a/src/lib-storage/index/index-storage.c b/src/lib-storage/index/index-storage.c index f805cdb5dd..761d0d9f24 100644 --- a/src/lib-storage/index/index-storage.c +++ b/src/lib-storage/index/index-storage.c @@ -57,27 +57,31 @@ void index_storage_add(struct mail_index *index) indexes = list; } -struct mail_index *index_storage_lookup_ref(const char *path) +struct mail_index * +index_storage_lookup_ref(const char *index_dir, const char *path) { struct index_list **list, *rec; struct mail_index *match; struct stat st1, st2; int destroy_count; - if (stat(path, &st1) < 0) - return NULL; + if (index_dir != NULL) { + if (stat(index_dir, &st1) < 0) + return NULL; + } - /* compare inodes so we don't break even with symlinks */ + /* compare index_dir inodes so we don't break even with symlinks. + for in-memory indexes compare just mailbox paths */ destroy_count = 0; match = NULL; for (list = &indexes; *list != NULL;) { rec = *list; - if (stat(rec->index->dir, &st2) == 0) { - if (st1.st_ino == st2.st_ino && - st1.st_dev == st2.st_dev) { - rec->refcount++; - match = rec->index; - } + if ((index_dir != NULL && stat(rec->index->dir, &st2) == 0 && + st1.st_ino == st2.st_ino && st1.st_dev == st2.st_dev) || + (index_dir == NULL && + strcmp(path, rec->index->mailbox_path) == 0)) { + rec->refcount++; + match = rec->index; } if (rec->refcount == 0) { diff --git a/src/lib-storage/index/index-storage.h b/src/lib-storage/index/index-storage.h index 94620237b7..eba3509bb4 100644 --- a/src/lib-storage/index/index-storage.h +++ b/src/lib-storage/index/index-storage.h @@ -55,7 +55,8 @@ int index_storage_lock(struct index_mailbox *ibox, enum mail_lock_type lock_type); void index_storage_add(struct mail_index *index); -struct mail_index *index_storage_lookup_ref(const char *path); +struct mail_index * +index_storage_lookup_ref(const char *index_dir, const char *path); void index_storage_unref(struct mail_index *index); void index_storage_destroy_unrefed(void); diff --git a/src/lib-storage/index/maildir/maildir-storage.c b/src/lib-storage/index/maildir/maildir-storage.c index ab53dd306c..5617791652 100644 --- a/src/lib-storage/index/maildir/maildir-storage.c +++ b/src/lib-storage/index/maildir/maildir-storage.c @@ -397,7 +397,7 @@ maildir_open(struct mail_storage *storage, const char *name, index_dir = maildir_get_index_path(storage, name); control_dir = maildir_get_control_path(storage, name); - index = index_storage_lookup_ref(index_dir); + index = index_storage_lookup_ref(index_dir, path); if (index == NULL) { index = maildir_index_alloc(path, index_dir, control_dir); index_storage_add(index); diff --git a/src/lib-storage/index/mbox/mbox-storage.c b/src/lib-storage/index/mbox/mbox-storage.c index 80dfe93d0a..7bb614aa2a 100644 --- a/src/lib-storage/index/mbox/mbox-storage.c +++ b/src/lib-storage/index/mbox/mbox-storage.c @@ -393,7 +393,7 @@ static struct mailbox *mbox_open(struct mail_storage *storage, const char *name, index_dir = mbox_get_index_dir(storage, name); } - index = index_storage_lookup_ref(index_dir); + index = index_storage_lookup_ref(index_dir, path); if (index == NULL) { index = mbox_index_alloc(path, index_dir, index_dir); index_storage_add(index);