dovecot-2.2: istream-sized: Fail read() also when the stream is ...

dovecot at dovecot.org dovecot at dovecot.org
Sun Sep 22 07:20:24 EEST 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/5b1aac85eb17
changeset: 16817:5b1aac85eb17
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Sep 22 07:19:39 2013 +0300
description:
istream-sized: Fail read() also when the stream is larger than it should have been.

diffstat:

 src/lib/istream-sized.c |  10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)

diffs (34 lines):

diff -r afc8c800f6ca -r 5b1aac85eb17 src/lib/istream-sized.c
--- a/src/lib/istream-sized.c	Sun Sep 22 06:30:47 2013 +0300
+++ b/src/lib/istream-sized.c	Sun Sep 22 07:19:39 2013 +0300
@@ -8,6 +8,7 @@
 	struct istream_private istream;
 
 	uoff_t size;
+	bool failed;
 };
 
 static ssize_t i_stream_sized_read(struct istream_private *stream)
@@ -18,6 +19,12 @@
 	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 @@
 			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) {


More information about the dovecot-cvs mailing list