From: Timo Sirainen Date: Fri, 20 Sep 2019 12:48:10 +0000 (+0300) Subject: lib-index: Fix potential assert-crash when rotating log file X-Git-Tag: 2.3.10~115 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=663a98bfc7f0b12b47a6f30fa4279a52e5f68bc1;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Fix potential assert-crash when rotating log file Unlock the old head file before attempting to clean it. Fixes: Panic: file mail-transaction-log.c: line 229 (mail_transaction_logs_clean): assertion failed: (!file->locked || file->refcount > 0) This seems to only have happened during new obox index merging. --- diff --git a/src/lib-index/mail-transaction-log.c b/src/lib-index/mail-transaction-log.c index 044153f9cd..5a9cee1623 100644 --- a/src/lib-index/mail-transaction-log.c +++ b/src/lib-index/mail-transaction-log.c @@ -260,7 +260,7 @@ bool mail_transaction_log_want_rotate(struct mail_transaction_log *log) int mail_transaction_log_rotate(struct mail_transaction_log *log, bool reset) { - struct mail_transaction_log_file *file; + struct mail_transaction_log_file *file, *old_head; const char *path = log->head->filepath; struct stat st; int ret; @@ -304,15 +304,15 @@ int mail_transaction_log_rotate(struct mail_transaction_log *log, bool reset) i_assert(file->locked); } - if (--log->head->refcount == 0) - mail_transaction_logs_clean(log); - else { - /* the newly created log file is already locked */ - mail_transaction_log_file_unlock(log->head, - !log->index->log_sync_locked ? "rotating" : - "rotating while syncing"); - } + old_head = log->head; mail_transaction_log_set_head(log, file); + + /* the newly created log file is already locked */ + mail_transaction_log_file_unlock(old_head, + !log->index->log_sync_locked ? "rotating" : + "rotating while syncing"); + if (--old_head->refcount == 0) + mail_transaction_logs_clean(log); return 0; }