From 98f709deac9381721b93d896c27576dbff1f711c Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Fri, 12 Nov 2021 10:43:16 +0100 Subject: [PATCH 1/2] lib-storage: mail-duplicate - Fix panic occurring when user has no configured home directory. Panic was: Panic: file imem.c: line 65 (i_strconcat): assertion failed: (str1 != NULL) --- src/lib-storage/mail-duplicate.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/lib-storage/mail-duplicate.c b/src/lib-storage/mail-duplicate.c index ff4fa5630b..407fe4aec9 100644 --- a/src/lib-storage/mail-duplicate.c +++ b/src/lib-storage/mail-duplicate.c @@ -722,14 +722,17 @@ mail_duplicate_db_init(struct mail_user *user, const char *name) e_debug(db->event, "Initialize"); + db->user = user; + if (mail_user_get_home(user, &home) <= 0) { e_error(db->event, "User %s doesn't have home dir set, " "disabling duplicate database", user->username); + return db; } - db->user = user; - db->path = home == NULL ? NULL : - i_strconcat(home, "/.dovecot.", name, NULL); + i_assert(home != NULL); + + db->path = i_strconcat(home, "/.dovecot.", name, NULL); db->dotlock_set = default_mail_duplicate_dotlock_set; lock_dir = mail_user_get_volatile_dir(user); From d36d2c595a12378b597f1fc82cd7b47cbbadb2e1 Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Fri, 12 Nov 2021 11:16:47 +0100 Subject: [PATCH 2/2] lib-storage: mail-duplicate - Fix segfault occurring when user has no configured home directory Occurred only when a duplicate DB transaction was created. --- src/lib-storage/mail-duplicate.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/lib-storage/mail-duplicate.c b/src/lib-storage/mail-duplicate.c index 407fe4aec9..7a78caa7c7 100644 --- a/src/lib-storage/mail-duplicate.c +++ b/src/lib-storage/mail-duplicate.c @@ -491,13 +491,15 @@ mail_duplicate_transaction_free(struct mail_duplicate_transaction **_trans) i_assert(trans->db->transaction_count > 0); trans->db->transaction_count--; - iter = hash_table_iterate_init(trans->hash); - while (hash_table_iterate(iter, trans->hash, &d, &d)) - mail_duplicate_unlock(trans, d); - hash_table_iterate_deinit(&iter); + if (hash_table_is_created(trans->hash)) { + iter = hash_table_iterate_init(trans->hash); + while (hash_table_iterate(iter, trans->hash, &d, &d)) + mail_duplicate_unlock(trans, d); + hash_table_iterate_deinit(&iter); + hash_table_destroy(&trans->hash); + } i_assert(trans->id_lock_count == 0); - hash_table_destroy(&trans->hash); event_unref(&trans->event); pool_unref(&trans->pool); }