Skip to content

Commit

Permalink
lib-index: Fix assert-crash with lock_method=dotlock
Browse files Browse the repository at this point in the history
The dotlock wasn't deleted in all code paths. Fix this by simplifying
the unlocking to be done the same way with and without dotlock.

Fixes:
Panic: file mail-cache.c: line 624 (mail_cache_lock_file): assertion failed: (cache->dotlock == NULL)
  • Loading branch information
sirainen authored and villesavolainen committed Feb 9, 2018
1 parent e7333ee commit 1c9fbec
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 10 deletions.
1 change: 0 additions & 1 deletion src/lib-index/mail-cache-private.h
Expand Up @@ -108,7 +108,6 @@ struct mail_cache {
unsigned int remap_counter;

struct dotlock_settings dotlock_settings;
struct dotlock *dotlock;
struct file_lock *file_lock;

/* mmap_disable=no: hdr points to data / NULL when cache is invalid.
Expand Down
16 changes: 7 additions & 9 deletions src/lib-index/mail-cache.c
Expand Up @@ -611,8 +611,8 @@ static int mail_cache_lock_file(struct mail_cache *cache, bool nonblock)
nonblock = TRUE;
}

i_assert(cache->file_lock == NULL);
if (cache->index->lock_method != FILE_LOCK_METHOD_DOTLOCK) {
i_assert(cache->file_lock == NULL);
timeout_secs = I_MIN(MAIL_CACHE_LOCK_TIMEOUT,
cache->index->max_lock_timeout_secs);

Expand All @@ -621,14 +621,15 @@ static int mail_cache_lock_file(struct mail_cache *cache, bool nonblock)
nonblock ? 0 : timeout_secs,
&cache->file_lock);
} else {
struct dotlock *dotlock;
enum dotlock_create_flags flags =
nonblock ? DOTLOCK_CREATE_FLAG_NONBLOCK : 0;

i_assert(cache->dotlock == NULL);
ret = file_dotlock_create(&cache->dotlock_settings,
cache->filepath, flags,
&cache->dotlock);
if (ret < 0) {
cache->filepath, flags, &dotlock);
if (ret > 0)
cache->file_lock = file_lock_from_dotlock(&dotlock);
else if (ret < 0) {
mail_cache_set_syscall_error(cache,
"file_dotlock_create()");
}
Expand All @@ -648,10 +649,7 @@ static int mail_cache_lock_file(struct mail_cache *cache, bool nonblock)

static void mail_cache_unlock_file(struct mail_cache *cache)
{
if (cache->index->lock_method != FILE_LOCK_METHOD_DOTLOCK)
file_unlock(&cache->file_lock);
else
file_dotlock_delete(&cache->dotlock);
file_unlock(&cache->file_lock);
}

static int
Expand Down

0 comments on commit 1c9fbec

Please sign in to comment.