From a41f4337c605e93b80c4ad07412d4a86de7f91e6 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Tue, 25 Aug 2020 22:22:10 +0200
Subject: [PATCH] testsuite: testsuite-mailstore - Check mail index validity in
 testsuite_mailstore_mail_index().

Providing an out-of-range index caused an assert panic.

Panic was:

Panic: file mail-index-transaction-update.c: line 19 (mail_index_transaction_lookup): assertion failed: (seq >= t->first_new_seq && seq <= t->last_new_seq)
---
 Makefile.am                         |  1 +
 src/testsuite/testsuite-mailstore.c |  5 +++++
 tests/failures/fuzz3.svtest         | 12 ++++++++++++
 3 files changed, 18 insertions(+)
 create mode 100644 tests/failures/fuzz3.svtest

diff --git a/Makefile.am b/Makefile.am
index 3249569ef..1dfb0e6f4 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -196,6 +196,7 @@ $(test_cases):
 failure_test_cases = \
 	tests/failures/fuzz1.svtest \
 	tests/failures/fuzz2.svtest \
+	tests/failures/fuzz3.svtest \
 	tests/failures/mailbox-bad-utf8.svtest
 
 $(failure_test_cases):
diff --git a/src/testsuite/testsuite-mailstore.c b/src/testsuite/testsuite-mailstore.c
index 9c584246a..7762d5004 100644
--- a/src/testsuite/testsuite-mailstore.c
+++ b/src/testsuite/testsuite-mailstore.c
@@ -274,11 +274,16 @@ bool testsuite_mailstore_mail_index(const struct sieve_runtime_env *renv,
 				    const char *folder, unsigned int index)
 {
 	struct testsuite_mailstore_mail *tmail;
+	struct mailbox_status status;
 
 	tmail = testsuite_mailstore_open(folder);
 	if (tmail == NULL)
 		return FALSE;
 
+	mailbox_get_open_status(tmail->box, STATUS_MESSAGES, &status);
+	if (index >= status.messages)
+		return FALSE;
+
 	mail_set_seq(tmail->mail, index+1);
 	testsuite_message_set_mail(renv, tmail->mail);
 
diff --git a/tests/failures/fuzz3.svtest b/tests/failures/fuzz3.svtest
new file mode 100644
index 000000000..c1c22dcf5
--- /dev/null
+++ b/tests/failures/fuzz3.svtest
@@ -0,0 +1,12 @@
+require "vnd.dovecot.testsuite";
+require "fileinto";
+require "mailbox";
+
+test"" {
+	fileinto :create "Folder";
+
+	if test_result_execute {
+	}
+
+	test_message :folder "Folder" 2;
+}
-- 
GitLab