From: Timo Sirainen Date: Wed, 13 Sep 2017 15:32:23 +0000 (+0300) Subject: lib-index: If mail_index_view is leaked, include in Panic the file:line where it... X-Git-Tag: 2.3.0.rc1~1031 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5ea06115cb60413b62ffb58ffdd62786fec6a316;p=thirdparty%2Fdovecot%2Fcore.git lib-index: If mail_index_view is leaked, include in Panic the file:line where it was opened --- diff --git a/src/lib-index/mail-index-view-private.h b/src/lib-index/mail-index-view-private.h index e291fae1a5..ed059934b8 100644 --- a/src/lib-index/mail-index-view-private.h +++ b/src/lib-index/mail-index-view-private.h @@ -51,6 +51,9 @@ struct mail_index_view { struct mail_index *index; struct mail_transaction_log_view *log_view; + const char *source_filename; + unsigned int source_linenum; + uint32_t indexid; unsigned int inconsistency_id; uint64_t highest_modseq; diff --git a/src/lib-index/mail-index-view.c b/src/lib-index/mail-index-view.c index 7b4ff19f7e..aacc5980c0 100644 --- a/src/lib-index/mail-index-view.c +++ b/src/lib-index/mail-index-view.c @@ -630,9 +630,18 @@ mail_index_view_open_with_map(struct mail_index *index, return view; } -struct mail_index_view *mail_index_view_open(struct mail_index *index) +#undef mail_index_view_open +struct mail_index_view * +mail_index_view_open(struct mail_index *index, + const char *source_filename, unsigned int source_linenum) { - return mail_index_view_open_with_map(index, index->map); + struct mail_index_view *view; + + view = mail_index_view_open_with_map(index, index->map); + /* these can be used to debug mail_index_view_close() leaks */ + view->source_filename = source_filename; + view->source_linenum = source_linenum; + return view; } const struct mail_index_ext * diff --git a/src/lib-index/mail-index.c b/src/lib-index/mail-index.c index 4ab64aeb36..84042b753e 100644 --- a/src/lib-index/mail-index.c +++ b/src/lib-index/mail-index.c @@ -693,6 +693,12 @@ void mail_index_close_file(struct mail_index *index) static void mail_index_close_nonopened(struct mail_index *index) { i_assert(!index->syncing); + + if (index->views != NULL) { + i_panic("Leaked view for index %s: Opened in %s:%u", + index->filepath, index->views->source_filename, + index->views->source_linenum); + } i_assert(index->views == NULL); if (index->map != NULL) diff --git a/src/lib-index/mail-index.h b/src/lib-index/mail-index.h index 87e002879d..687e051b13 100644 --- a/src/lib-index/mail-index.h +++ b/src/lib-index/mail-index.h @@ -301,7 +301,11 @@ mail_index_refresh(struct mail_index *index); /* View can be used to look into index. Sequence numbers inside view change only when you synchronize it. The view acquires required locks automatically, but you'll have to drop them manually. */ -struct mail_index_view *mail_index_view_open(struct mail_index *index); +struct mail_index_view * +mail_index_view_open(struct mail_index *index, + const char *source_filename, unsigned int source_linenum); +#define mail_index_view_open(index) \ + mail_index_view_open(index, __FILE__, __LINE__) void mail_index_view_close(struct mail_index_view **view); /* Returns the index for given view. */