From: Timo Sirainen Date: Sun, 22 Sep 2013 04:19:39 +0000 (+0300) Subject: istream-sized: Fail read() also when the stream is larger than it should have been. X-Git-Tag: 2.2.6~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=825111a4e508289a886a01fccbf22e5cc014eee4;p=thirdparty%2Fdovecot%2Fcore.git istream-sized: Fail read() also when the stream is larger than it should have been. --- diff --git a/src/lib/istream-sized.c b/src/lib/istream-sized.c index 9ef44d1178..b20ac03657 100644 --- a/src/lib/istream-sized.c +++ b/src/lib/istream-sized.c @@ -8,6 +8,7 @@ struct sized_istream { struct istream_private istream; uoff_t size; + bool failed; }; static ssize_t i_stream_sized_read(struct istream_private *stream) @@ -18,6 +19,12 @@ static ssize_t i_stream_sized_read(struct istream_private *stream) ssize_t ret; size_t pos; + if (sstream->failed) { + /* avoid duplicate errors */ + stream->istream.stream_errno = EINVAL; + return -1; + } + if (stream->istream.v_offset + (stream->pos - stream->skip) >= sstream->size) { stream->istream.eof = TRUE; @@ -56,6 +63,9 @@ static ssize_t i_stream_sized_read(struct istream_private *stream) stream->iostream.error); pos = left; stream->istream.eof = TRUE; + stream->istream.stream_errno = EINVAL; + sstream->failed = TRUE; + return -1; } else if (!stream->istream.eof) { /* still more to read */ } else if (stream->istream.stream_errno == ENOENT) {