From 9fd62ffaa5ac4a8ec5dee08fdd4bdcc65d582448 Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Sun, 13 Oct 2019 11:01:53 +0200 Subject: [PATCH] lib: istream - Fix calling i_stream_nonseekable_try_seek() without intermittent reads. Calling i_stream_nonseekable_try_seek() sets stream->high_pos when seeking back within buffer. Once i_stream_read_memarea() is called, the pos is set to high_pos and the high pos is cleared. However, when no read is performed in the mean time, another call to i_stream_nonseekable_try_seek() would overwrite the high_pos value with pos, causing the true value to get lost, leading to all kinds of issues. This is fixed by checking whether high_pos is already set and not touching it when it is (first value is the only valid one). One issue this caused is that the mbox storage would no longer work with compression, triggering `unexpected EOF' errors. --- src/lib/istream.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/istream.c b/src/lib/istream.c index 83b8008495..8fd6414022 100644 --- a/src/lib/istream.c +++ b/src/lib/istream.c @@ -1065,7 +1065,8 @@ bool i_stream_nonseekable_try_seek(struct istream_private *stream, /* seeking backwards within what's already cached */ stream->skip = v_offset - start_offset; stream->istream.v_offset = v_offset; - stream->high_pos = stream->pos; + if (stream->high_pos == 0) + stream->high_pos = stream->pos; stream->pos = stream->skip; } else { /* read forward */ -- 2.47.3