From: Timo Sirainen Date: Thu, 22 Oct 2020 19:46:35 +0000 (+0300) Subject: lib: istream-seekable - Fix returning stream size X-Git-Tag: 2.3.13~68 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d1808bf2ddb018f3f6856abe55de6a7e36e950be;p=thirdparty%2Fdovecot%2Fcore.git lib: istream-seekable - Fix returning stream size The returned size may have been truncated. --- diff --git a/src/lib/istream-seekable.c b/src/lib/istream-seekable.c index 9750cbd67e..fdaaaaee6a 100644 --- a/src/lib/istream-seekable.c +++ b/src/lib/istream-seekable.c @@ -162,7 +162,8 @@ static ssize_t read_more(struct seekable_istream *sstream) sstream->cur_input = sstream->input[sstream->cur_idx++]; if (sstream->cur_input == NULL) { /* last one, EOF */ - sstream->size = sstream->istream.istream.v_offset; + sstream->size = sstream->istream.istream.v_offset + + (sstream->istream.pos - sstream->istream.skip); sstream->istream.istream.eof = TRUE; /* Now that EOF is reached, the stream can't return 0 anymore. Callers can now use this stream in places diff --git a/src/lib/test-istream-seekable.c b/src/lib/test-istream-seekable.c index e57eebadfb..7d05347597 100644 --- a/src/lib/test-istream-seekable.c +++ b/src/lib/test-istream-seekable.c @@ -216,6 +216,23 @@ static void test_istream_seekable_invalid_read(void) test_end(); } +static void test_istream_seekable_get_size(void) +{ + test_begin("istream seekable get size"); + struct istream *str_input = test_istream_create("123456"); + str_input->seekable = FALSE; + struct istream *seek_inputs[] = { str_input, NULL }; + struct istream *input = i_stream_create_seekable(seek_inputs, 32, fd_callback, NULL); + uoff_t size; + test_assert(i_stream_read(input) == 6); + test_assert(i_stream_read(input) == -1); + test_assert(i_stream_get_size(input, TRUE, &size) == 1 && + size == 6); + i_stream_unref(&input); + i_stream_unref(&str_input); + test_end(); +} + void test_istream_seekable(void) { unsigned int i; @@ -234,4 +251,5 @@ void test_istream_seekable(void) test_istream_seekable_eof(); test_istream_seekable_early_end(); test_istream_seekable_invalid_read(); + test_istream_seekable_get_size(); }