From: Timo Sirainen Date: Fri, 8 Jun 2018 20:17:04 +0000 (+0300) Subject: lib: istream-try - Don't assert-crash with empty parent istream X-Git-Tag: 2.2.36.1~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=63ad91f05d5fcffba47deb6dc893d42519c8ca1e;p=thirdparty%2Fdovecot%2Fcore.git lib: istream-try - Don't assert-crash with empty parent istream Fixes: Panic: file istream.c: line 327 (i_stream_read_memarea): assertion failed: (stream->eof) --- diff --git a/src/lib/istream-try.c b/src/lib/istream-try.c index 4284f6d17a..0e9b78ad09 100644 --- a/src/lib/istream-try.c +++ b/src/lib/istream-try.c @@ -76,6 +76,11 @@ static int i_stream_try_detect(struct try_istream *tstream) } if (ret == 0) return 0; + if (try_input->stream_errno == 0) { + /* empty file */ + tstream->istream.istream.eof = TRUE; + return -1; + } if (try_input->stream_errno != EINVAL) { tstream->istream.istream.stream_errno = try_input->stream_errno; diff --git a/src/lib/test-istream-try.c b/src/lib/test-istream-try.c index 39a4185e73..91ac37ddd1 100644 --- a/src/lib/test-istream-try.c +++ b/src/lib/test-istream-try.c @@ -4,7 +4,7 @@ #include "istream.h" #include "istream-try.h" -void test_istream_try(void) +static void test_istream_try_normal(void) { bool finished = FALSE; @@ -128,3 +128,27 @@ void test_istream_try(void) i_assert(finished); test_end(); } + +static void test_istream_try_empty(void) +{ + test_begin("istream try empty stream"); + struct istream *test_inputs[] = { + test_istream_create(""), + test_istream_create(""), + NULL + }; + struct istream *try_input = istream_try_create(test_inputs); + test_assert(i_stream_read(try_input) == -1); + test_assert(try_input->eof); + test_assert(try_input->stream_errno == 0); + i_stream_unref(&test_inputs[0]); + i_stream_unref(&test_inputs[1]); + i_stream_unref(&try_input); + test_end(); +} + +void test_istream_try(void) +{ + test_istream_try_normal(); + test_istream_try_empty(); +}