summaryrefslogtreecommitdiff
path: root/net-mail/dovecot
diff options
context:
space:
mode:
authorV3n3RiX <venerix@redcorelinux.org>2020-11-25 22:39:15 +0000
committerV3n3RiX <venerix@redcorelinux.org>2020-11-25 22:39:15 +0000
commitd934827bf44b7cfcf6711964418148fa60877668 (patch)
tree0625f358789b5e015e49db139cc1dbc9be00428f /net-mail/dovecot
parent2e34d110f164bf74d55fced27fe0000201b3eec5 (diff)
gentoo resync : 25.11.2020
Diffstat (limited to 'net-mail/dovecot')
-rw-r--r--net-mail/dovecot/Manifest4
-rw-r--r--net-mail/dovecot/dovecot-2.3.11.3-r1.ebuild2
-rw-r--r--net-mail/dovecot/dovecot-2.3.11.3-r2.ebuild297
-rw-r--r--net-mail/dovecot/files/dovecot-fix-search-crash.patch91
4 files changed, 392 insertions, 2 deletions
diff --git a/net-mail/dovecot/Manifest b/net-mail/dovecot/Manifest
index 224b6e3a24f0..b29af1f3140f 100644
--- a/net-mail/dovecot/Manifest
+++ b/net-mail/dovecot/Manifest
@@ -1,4 +1,5 @@
AUX dovecot-2.3.11.3-apop-fix.patch 2226 BLAKE2B 47971fc29ff3add43ca7ee253c4e1579dd22e603c6692f592c605a742330df80309ee06f8bb811e64de03392e0dee19efe1964229f61209b9f48fb0dd557b7d2 SHA512 6ebc10a6e0ca9f4790cbe57a9e9283838c5fbe124e9be305fcd16e472a5edea97a055700613fb6a1a43fe139537da80a603493f250b34f2179f969da2a09f2cc
+AUX dovecot-fix-search-crash.patch 3417 BLAKE2B 3d3b63d7be8d19fea2f159b6191fb1dcb94be4abe6cbbde5984c0c6e55fcb56a6e32bbe07650a2d218b3ecc55ede620e95befff24dce3a562733b119142e216d SHA512 9cb34a7f6de6d19ec7d6e4c3206c5d15f6531f92027d7dbef21284206ddd9f3418d4a1266d2860789dfa56f97579a89f3cafc54f24152f321dddb9b470d9f473
AUX dovecot-unwind-generic.patch 645 BLAKE2B 6598abbd2819f7109d4caacbce5123b8810b93b623956561a12a749cbc582667caa160eac62305067db6037f820c8e1a8bd8a22da09a454afcb9e21209cc5fd3 SHA512 6ede0edd5bd6d1123ff1567886898eee5795baa549c610ba8a3567c0f8fee27d69028aaf8b6067c2f37b915a07e165aa0d6a2d5fb8314deffd61a187b18de4ae
AUX dovecot-userdb-passwd-fix.patch 500 BLAKE2B 133e7b13cf3dd1515db5694945abd2d00ecd89c4a766ea873099ebbdd450700e70b80696ba58b21cc4f7160fa3becde6453c9334d41cdad426e3f59bd9e5491e SHA512 18a26eed0c793b0ccee828dc5eafc6448dda94d705597b19c3333f21944e838b677af2884f5fb65eb2f6dc79158ad8b3143b24d3788d841038de6dd24885fc0d
AUX dovecot.init-r6 1573 BLAKE2B 206318cbf7a6ef0276cb93237b091dd34dc2603a00f13ed288c787dc81f8902e770f7774c54eba90de49e9634eb93873046a043bd7825cfb65bab5b2ea9ce108 SHA512 982f9897e4a0a5a3957bb12785961c9cde72a2c941f55efdb23e9a26cec19efe89e3be4effe79522c297ea2b258d201db78c19b6e3f9cd5e68d3736c2a0f0063
@@ -12,7 +13,8 @@ DIST dovecot-2.3.11.3.tar.gz 7353412 BLAKE2B 0067989b35fe29c0d23f6ca25712a87fa69
DIST dovecot-2.3.7.2.tar.gz 7076231 BLAKE2B 2cb93aa594db722489063b490469dfe284b1f997b64c9a699b506ccbd04e8e7c2d503ddc12a2598958dfca88560c19487801a728f386b8fea5f637a75b83812e SHA512 172f7f0edb884259e4c050607510aee67a35c3a20b7dd147e7c8a25a04921c18f7d6b5c85af2c69ae8c4d53791550970e471b033dbfae94253e331053b6a317d
EBUILD dovecot-2.2.36.4.ebuild 8605 BLAKE2B b649cd8db3cc6ed5fe93a6013a16e7f99a121e35d684fdfa9fc74aec1487f571fb1f59f4433ad89a6bdcd33de0d916b111226a33bdacc084383580c881d98551 SHA512 811bd1cb2ebec984f98d02a975c7774e0449e1b87c26840107d2e93c79ba69f0c8714d2db5c63513233893c0230080d2fd002962aa6b536f12f6ba6d36f7b5a9
EBUILD dovecot-2.3.10.1.ebuild 8629 BLAKE2B 4d664f1ff75b846a2be7dcca52b7189efac3c6f95e40a0af935dd16f857c51db53aa72023e94b4ae86a5bf892475fd4259dc5085ea41a5053b702ced5b2725cd SHA512 d783676c087faaa047de828eb6a38f21a4512e81cea4a1dcb03d4e852518cb520cfa66d88540a63c3805fdc1144f4895d8a4db8269c3bbf93691bcea080dcbec
-EBUILD dovecot-2.3.11.3-r1.ebuild 8830 BLAKE2B becfd7b5ea04d99bca605ab6a45a5a009cc43bb4d8bf0a1c86a4686ef8026ce39a609ca80e5d88bcf8cd301caa28d4d899f25e2bde02b183d95a9a1b1717debb SHA512 61e9918c800bc1c074cfddca4e71859f24dc57905f6ebac7dece8e5fe7b6aabebdf691b0126b9aed4c868ee74e2ee4e7a36c042e97ef7f032d6da1f2a24f8f2d
+EBUILD dovecot-2.3.11.3-r1.ebuild 8837 BLAKE2B 668d4a31360b252a60ebf808038bdf9c20c67d069098d2aa698a96479e40ffd5f9355fc5c720896d196d9cb4821881caef2cacc341dd9df147bb67bad8c76eaa SHA512 021460cdab894122d2ff9265cb2e909518a362295ae77bb04735d0e995464f9feec7695651055ca78c6716c890f50a976b057e9c7745d3d90740af8efeb550de
+EBUILD dovecot-2.3.11.3-r2.ebuild 8882 BLAKE2B 11c3702ab1c2fd8f885ab69c177b03b6ca997aa10b0360b94b9f84e99b195eeb28d27f2dc323b151eda418d7e8c3244100fdfc83521ef0f071530201a584594a SHA512 061968137d1af8c8a1c42c0af82352fac8633896a324488931f12c93c1cc754eb550e819244b348263c15f5b1d4e7645cc55bacc7a57b2ba856d056c8c3920c8
EBUILD dovecot-2.3.11.3.ebuild 8676 BLAKE2B 3ec42d4194a1db2e6090f223af7d9859c85cb134e31dfad5ed53a8d420594c95b4a57634e88ffbfd057a07c346677134dcb980d3bfda253c5cb1a07e5c7638be SHA512 cc1019fbd851ca8a2e27f9ee9d4004730af8b6eea64c00ee99fa816cd5229e8f523cc6f61ba52ebaf0f684d07d1076cbb497e5720c6b9108c00128803f07e8ab
EBUILD dovecot-2.3.7.2.ebuild 8717 BLAKE2B 2aef6fffe859d0965f3e809739cdec16165fc4935cda3eae6ea89dce803366ac7fb0ad0dd1a95b3a4ee040a2be61cb44e58e61fb44feb47d0ef9e3496febe30e SHA512 3412f9224528f4872777d580e352e8cd679b7d1a9f88a20594e56358cd026f74343b624205e8ea0972ead3b3c9157a8061ddc7c3181c183fb6caf1d1c2f2f515
MISC metadata.xml 998 BLAKE2B c65428e9f0019e942fc1d634d53c2a85c7f8a699e34cf9c49ae09bfe9ce8a54fd368512f7a4d74f6a10baff949a9fe8021e1e0c009f8315b100fb5736efd34ae SHA512 f285f0928dc0915c8e8cebb966de84f5564be9f7dd3baa7c0cccb3343da75507003aeadf80fe34ffb4b69dd9208997a80fdb47c20bfd65fdc60c43423a00813c
diff --git a/net-mail/dovecot/dovecot-2.3.11.3-r1.ebuild b/net-mail/dovecot/dovecot-2.3.11.3-r1.ebuild
index 8e907759746f..1c463e0ac87c 100644
--- a/net-mail/dovecot/dovecot-2.3.11.3-r1.ebuild
+++ b/net-mail/dovecot/dovecot-2.3.11.3-r1.ebuild
@@ -28,7 +28,7 @@ HOMEPAGE="https://www.dovecot.org/"
SLOT="0"
LICENSE="LGPL-2.1 MIT"
-KEYWORDS="~alpha ~amd64 arm ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sparc ~x86"
+KEYWORDS="~alpha ~amd64 arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sparc ~x86"
IUSE_DOVECOT_AUTH="kerberos ldap lua mysql pam postgres sqlite vpopmail"
IUSE_DOVECOT_COMPRESS="bzip2 lzma lz4 zlib zstd"
diff --git a/net-mail/dovecot/dovecot-2.3.11.3-r2.ebuild b/net-mail/dovecot/dovecot-2.3.11.3-r2.ebuild
new file mode 100644
index 000000000000..2b42893baff2
--- /dev/null
+++ b/net-mail/dovecot/dovecot-2.3.11.3-r2.ebuild
@@ -0,0 +1,297 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+# do not add a ssl USE flag. ssl is mandatory
+SSL_DEPS_SKIP=1
+inherit autotools ssl-cert systemd toolchain-funcs
+
+MY_P="${P/_/.}"
+#MY_S="${PN}-ce-${PV}"
+major_minor="$(ver_cut 1-2)"
+sieve_version="0.5.11"
+if [[ ${PV} == *_rc* ]] ; then
+ rc_dir="rc/"
+else
+ rc_dir=""
+fi
+SRC_URI="https://dovecot.org/releases/${major_minor}/${rc_dir}${MY_P}.tar.gz
+ sieve? (
+ https://pigeonhole.dovecot.org/releases/${major_minor}/${rc_dir}${PN}-${major_minor}-pigeonhole-${sieve_version}.tar.gz
+ )
+ managesieve? (
+ https://pigeonhole.dovecot.org/releases/${major_minor}/${rc_dir}${PN}-${major_minor}-pigeonhole-${sieve_version}.tar.gz
+ ) "
+DESCRIPTION="An IMAP and POP3 server written with security primarily in mind"
+HOMEPAGE="https://www.dovecot.org/"
+
+SLOT="0"
+LICENSE="LGPL-2.1 MIT"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sparc ~x86"
+
+IUSE_DOVECOT_AUTH="kerberos ldap lua mysql pam postgres sqlite vpopmail"
+IUSE_DOVECOT_COMPRESS="bzip2 lzma lz4 zlib zstd"
+IUSE_DOVECOT_OTHER="argon2 caps doc ipv6 libressl lucene managesieve rpc selinux sieve solr static-libs suid tcpd textcat unwind"
+
+IUSE="${IUSE_DOVECOT_AUTH} ${IUSE_DOVECOT_COMPRESS} ${IUSE_DOVECOT_OTHER}"
+
+DEPEND="argon2? ( dev-libs/libsodium )
+ bzip2? ( app-arch/bzip2 )
+ caps? ( sys-libs/libcap )
+ kerberos? ( virtual/krb5 )
+ ldap? ( net-nds/openldap )
+ lua? ( dev-lang/lua:* )
+ lucene? ( >=dev-cpp/clucene-2.3 )
+ lzma? ( app-arch/xz-utils )
+ lz4? ( app-arch/lz4 )
+ mysql? ( dev-db/mysql-connector-c:0= )
+ pam? ( sys-libs/pam )
+ postgres? ( dev-db/postgresql:* !dev-db/postgresql[ldap,threads] )
+ rpc? ( net-libs/libtirpc net-libs/rpcsvc-proto )
+ selinux? ( sec-policy/selinux-dovecot )
+ solr? ( net-misc/curl dev-libs/expat )
+ sqlite? ( dev-db/sqlite:* )
+ !libressl? ( dev-libs/openssl:0= )
+ libressl? ( dev-libs/libressl:0= )
+ suid? ( acct-group/mail )
+ tcpd? ( sys-apps/tcp-wrappers )
+ textcat? ( app-text/libexttextcat )
+ unwind? ( sys-libs/libunwind )
+ vpopmail? ( net-mail/vpopmail )
+ zlib? ( sys-libs/zlib )
+ zstd? ( app-arch/zstd )
+ virtual/libiconv
+ dev-libs/icu:="
+
+RDEPEND="${DEPEND}
+ acct-group/dovecot
+ acct-group/dovenull
+ acct-user/dovecot
+ acct-user/dovenull
+ net-mail/mailbase"
+
+PATCHES=(
+ "${FILESDIR}/${P}"-apop-fix.patch
+ "${FILESDIR}/${PN}"-unwind-generic.patch
+ "${FILESDIR}/${PN}"-fix-search-crash.patch
+ )
+
+pkg_setup() {
+ if use managesieve && ! use sieve; then
+ ewarn "managesieve USE flag selected but sieve USE flag unselected"
+ ewarn "sieve USE flag will be turned on"
+ fi
+}
+
+src_prepare() {
+ default
+ # bug 657108
+ #elibtoolize
+ eautoreconf
+}
+
+src_configure() {
+ local conf=""
+
+ if use postgres || use mysql || use sqlite; then
+ conf="${conf} --with-sql"
+ fi
+
+ # turn valgrind tests off. Bug #340791
+ VALGRIND=no econf \
+ --with-rundir="${EPREFIX}/run/dovecot" \
+ --with-statedir="${EPREFIX}/var/lib/dovecot" \
+ --with-moduledir="${EPREFIX}/usr/$(get_libdir)/dovecot" \
+ --without-stemmer \
+ --disable-rpath \
+ --without-libbsd \
+ --with-icu \
+ --with-ssl \
+ --with-systemdsystemunitdir="$(systemd_get_systemunitdir)" \
+ $( use_with argon2 sodium ) \
+ $( use_with bzip2 bzlib ) \
+ $( use_with caps libcap ) \
+ $( use_with kerberos gssapi ) \
+ $( use_with lua ) \
+ $( use_with ldap ) \
+ $( use_with lucene ) \
+ $( use_with lz4 ) \
+ $( use_with lzma ) \
+ $( use_with mysql ) \
+ $( use_with pam ) \
+ $( use_with postgres pgsql ) \
+ $( use_with sqlite ) \
+ $( use_with solr ) \
+ $( use_with tcpd libwrap ) \
+ $( use_with textcat ) \
+ $( use_with unwind libunwind ) \
+ $( use_with vpopmail ) \
+ $( use_with zlib ) \
+ $( use_with zstd ) \
+ $( use_enable static-libs static ) \
+ ${conf}
+
+ if use sieve || use managesieve ; then
+ # The sieve plugin needs this file to be build to determine the plugin
+ # directory and the list of libraries to link to.
+ emake dovecot-config
+ cd "../dovecot-${major_minor}-pigeonhole-${sieve_version}" || die "cd failed"
+ econf \
+ $( use_enable static-libs static ) \
+ --localstatedir="${EPREFIX}/var" \
+ --enable-shared \
+ --with-dovecot="${S}" \
+ $( use_with managesieve )
+ fi
+}
+
+src_compile() {
+ default
+ if use sieve || use managesieve ; then
+ cd "../dovecot-${major_minor}-pigeonhole-${sieve_version}" || die "cd failed"
+ emake CC="$(tc-getCC)" CFLAGS="${CFLAGS}"
+ fi
+}
+
+src_test() {
+ default
+ if use sieve || use managesieve ; then
+ cd "../dovecot-${major_minor}-pigeonhole-${sieve_version}" || die "cd failed"
+ default
+ fi
+}
+
+src_install() {
+ default
+
+ # insecure:
+ # use suid && fperms u+s /usr/libexec/dovecot/deliver
+ # better:
+ if use suid;then
+ einfo "Changing perms to allow deliver to be suided"
+ fowners root:mail "/usr/libexec/dovecot/dovecot-lda"
+ fperms 4750 "/usr/libexec/dovecot/dovecot-lda"
+ fi
+
+ newinitd "${FILESDIR}"/dovecot.init-r6 dovecot
+
+ rm -rf "${ED}"/usr/share/doc/dovecot
+
+ dodoc AUTHORS NEWS README TODO
+ dodoc doc/*.{txt,cnf,xml,sh}
+ docinto example-config
+ dodoc doc/example-config/*.{conf,ext}
+ docinto example-config/conf.d
+ dodoc doc/example-config/conf.d/*.{conf,ext}
+ docinto wiki
+ dodoc doc/wiki/*
+ doman doc/man/*.{1,7}
+
+ # Create the dovecot.conf file from the dovecot-example.conf file that
+ # the dovecot folks nicely left for us....
+ local conf="${ED}/etc/dovecot/dovecot.conf"
+ local confd="${ED}/etc/dovecot/conf.d"
+
+ insinto /etc/dovecot
+ doins doc/example-config/*.{conf,ext}
+ insinto /etc/dovecot/conf.d
+ doins doc/example-config/conf.d/*.{conf,ext}
+ fperms 0600 /etc/dovecot/dovecot-{ldap,sql}.conf.ext
+ rm -f "${confd}/../README"
+
+ # .maildir is the Gentoo default
+ local mail_location="maildir:~/.maildir"
+ sed -i -e \
+ "s|#mail_location =|mail_location = ${mail_location}|" \
+ "${confd}/10-mail.conf" \
+ || die "failed to update mail location settings in 10-mail.conf"
+
+ # We're using pam files (imap and pop3) provided by mailbase
+ if use pam; then
+ sed -i -e '/driver = pam/,/^[ \t]*}/ s|#args = dovecot|args = "\*"|' \
+ "${confd}/auth-system.conf.ext" \
+ || die "failed to update PAM settings in auth-system.conf.ext"
+ # mailbase does not provide a sieve pam file
+ use managesieve && dosym imap /etc/pam.d/sieve
+ sed -i -e \
+ 's/#!include auth-system.conf.ext/!include auth-system.conf.ext/' \
+ "${confd}/10-auth.conf" \
+ || die "failed to update PAM settings in 10-auth.conf"
+ fi
+
+ # Disable ipv6 if necessary
+ if ! use ipv6; then
+ sed -i -e 's/^#listen = \*, ::/listen = \*/g' "${conf}" \
+ || die "failed to update listen settings in dovecot.conf"
+ fi
+
+ # Update ssl cert locations
+ sed -i -e 's:^#ssl = yes:ssl = yes:' "${confd}/10-ssl.conf" \
+ || die "ssl conf failed"
+ sed -i -e 's:^ssl_cert =.*:ssl_cert = </etc/ssl/dovecot/server.pem:' \
+ -e 's:^ssl_key =.*:ssl_key = </etc/ssl/dovecot/server.key:' \
+ "${confd}/10-ssl.conf" || die "failed to update SSL settings in 10-ssl.conf"
+
+ # Install SQL configuration
+ if use mysql || use postgres; then
+ sed -i -e \
+ 's/#!include auth-sql.conf.ext/!include auth-sql.conf.ext/' \
+ "${confd}/10-auth.conf" || die "failed to update SQL settings in \
+ 10-auth.conf"
+ fi
+
+ # Install LDAP configuration
+ if use ldap; then
+ sed -i -e \
+ 's/#!include auth-ldap.conf.ext/!include auth-ldap.conf.ext/' \
+ "${confd}/10-auth.conf" \
+ || die "failed to update ldap settings in 10-auth.conf"
+ fi
+
+ if use vpopmail; then
+ sed -i -e \
+ 's/#!include auth-vpopmail.conf.ext/!include auth-vpopmail.conf.ext/' \
+ "${confd}/10-auth.conf" \
+ || die "failed to update vpopmail settings in 10-auth.conf"
+ fi
+
+ if use sieve || use managesieve ; then
+ cd "../dovecot-${major_minor}-pigeonhole-${sieve_version}" || die "cd failed"
+ emake DESTDIR="${ED}" install
+ sed -i -e \
+ 's/^[[:space:]]*#mail_plugins = $mail_plugins/mail_plugins = sieve/' "${confd}/15-lda.conf" \
+ || die "failed to update sieve settings in 15-lda.conf"
+ rm -rf "${ED}"/usr/share/doc/dovecot
+ docinto example-config/conf.d
+ dodoc doc/example-config/conf.d/*.conf
+ insinto /etc/dovecot/conf.d
+ doins doc/example-config/conf.d/90-sieve{,-extprograms}.conf
+ use managesieve && doins doc/example-config/conf.d/20-managesieve.conf
+ docinto sieve/rfc
+ dodoc doc/rfc/*.txt
+ docinto sieve/devel
+ dodoc doc/devel/DESIGN
+ docinto plugins
+ dodoc doc/plugins/*.txt
+ docinto extensions
+ dodoc doc/extensions/*.txt
+ docinto locations
+ dodoc doc/locations/*.txt
+ doman doc/man/*.{1,7}
+ fi
+
+ use static-libs || find "${ED}"/usr/lib* -name '*.la' -delete
+}
+
+pkg_postinst() {
+ # Let's not make a new certificate if we already have one
+ if ! [[ -e "${ROOT}"/etc/ssl/dovecot/server.pem && \
+ -e "${ROOT}"/etc/ssl/dovecot/server.key ]]; then
+ einfo "Creating SSL certificate"
+ SSL_ORGANIZATION="${SSL_ORGANIZATION:-Dovecot IMAP Server}"
+ install_cert /etc/ssl/dovecot/server
+ fi
+
+ elog "Please read https://doc.dovecot.org/installation_guide/upgrading/ for upgrade notes."
+}
diff --git a/net-mail/dovecot/files/dovecot-fix-search-crash.patch b/net-mail/dovecot/files/dovecot-fix-search-crash.patch
new file mode 100644
index 000000000000..860c070a433a
--- /dev/null
+++ b/net-mail/dovecot/files/dovecot-fix-search-crash.patch
@@ -0,0 +1,91 @@
+gentoo bug #756094
+
+From a668d767a710ca18ab6e7177d8e8be22a6b024fb Mon Sep 17 00:00:00 2001
+From: Timo Sirainen <timo.sirainen@open-xchange.com>
+Date: Mon, 31 Aug 2020 20:38:42 +0300
+Subject: [PATCH] lib-mail: message_parser_init_from_parts() - Fix crash if
+ MIME boundaries don't end
+
+If the last "boundary--" doens't exist, the parsing assert-crashed at
+deinit. This mainly happened when searching mails.
+
+Fixes:
+Panic: file message-parser.c: line 175 (message_part_finish): assertion failed: (ctx->nested_parts_count > 0)
+---
+ src/lib-mail/message-parser.c | 13 ++++++++-----
+ src/lib-mail/test-message-parser.c | 21 ++++++++++++++++++++-
+ 2 files changed, 28 insertions(+), 6 deletions(-)
+
+diff --git a/src/lib-mail/message-parser.c b/src/lib-mail/message-parser.c
+index 011dea9050..8baf622e59 100644
+--- a/src/lib-mail/message-parser.c
++++ b/src/lib-mail/message-parser.c
+@@ -138,6 +138,7 @@ message_part_append(struct message_parser_ctx *ctx)
+ struct message_part *parent = ctx->part;
+ struct message_part *part;
+
++ i_assert(!ctx->preparsed);
+ i_assert(parent != NULL);
+ i_assert((parent->flags & (MESSAGE_PART_FLAG_MULTIPART |
+ MESSAGE_PART_FLAG_MESSAGE_RFC822)) != 0);
+@@ -171,12 +172,14 @@ static void message_part_finish(struct message_parser_ctx *ctx)
+ {
+ struct message_part **const *parent_next_partp;
+
+- i_assert(ctx->nested_parts_count > 0);
+- ctx->nested_parts_count--;
++ if (!ctx->preparsed) {
++ i_assert(ctx->nested_parts_count > 0);
++ ctx->nested_parts_count--;
+
+- parent_next_partp = array_back(&ctx->next_part_stack);
+- array_pop_back(&ctx->next_part_stack);
+- ctx->next_part = *parent_next_partp;
++ parent_next_partp = array_back(&ctx->next_part_stack);
++ array_pop_back(&ctx->next_part_stack);
++ ctx->next_part = *parent_next_partp;
++ }
+
+ message_size_add(&ctx->part->parent->body_size, &ctx->part->body_size);
+ message_size_add(&ctx->part->parent->body_size, &ctx->part->header_size);
+diff --git a/src/lib-mail/test-message-parser.c b/src/lib-mail/test-message-parser.c
+index 13984f939e..a00f0d6200 100644
+--- a/src/lib-mail/test-message-parser.c
++++ b/src/lib-mail/test-message-parser.c
+@@ -178,9 +178,10 @@ static void test_message_parser_small_blocks(void)
+ static void test_message_parser_stop_early(void)
+ {
+ struct message_parser_ctx *parser;
+- struct istream *input;
++ struct istream *input, *input2;
+ struct message_part *parts;
+ struct message_block block;
++ const char *error;
+ unsigned int i;
+ pool_t pool;
+ int ret;
+@@ -198,6 +199,24 @@ static void test_message_parser_stop_early(void)
+ &block)) > 0) ;
+ test_assert(ret == 0);
+ message_parser_deinit(&parser, &parts);
++
++ /* test preparsed - first re-parse everything with a stream
++ that sees EOF at this position */
++ input2 = i_stream_create_from_data(test_msg, i);
++ parser = message_parser_init(pool, input2, &set_empty);
++ while ((ret = message_parser_parse_next_block(parser,
++ &block)) > 0) ;
++ test_assert(ret == -1);
++ message_parser_deinit(&parser, &parts);
++
++ /* now parse from the parts */
++ i_stream_seek(input2, 0);
++ parser = message_parser_init_from_parts(parts, input2, &set_empty);
++ while ((ret = message_parser_parse_next_block(parser,
++ &block)) > 0) ;
++ test_assert(ret == -1);
++ test_assert(message_parser_deinit_from_parts(&parser, &parts, &error) == 0);
++ i_stream_unref(&input2);
+ }
+
+ i_stream_unref(&input);