From d1808bf2ddb018f3f6856abe55de6a7e36e950be Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Thu, 22 Oct 2020 22:46:35 +0300 Subject: [PATCH] lib: istream-seekable - Fix returning stream size The returned size may have been truncated. --- src/lib/istream-seekable.c | 3 ++- src/lib/test-istream-seekable.c | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) 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(); } -- 2.47.3