]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
istream-sized: Fail read() also when the stream is larger than it should have been.
authorTimo Sirainen <tss@iki.fi>
Sun, 22 Sep 2013 04:19:39 +0000 (07:19 +0300)
committerTimo Sirainen <tss@iki.fi>
Sun, 22 Sep 2013 04:19:39 +0000 (07:19 +0300)
src/lib/istream-sized.c

index 9ef44d11785a6ac4ff916b771f33baf3a48b0f4b..b20ac036574a6948eea1fbcab7ad0ec5f0bf98e6 100644 (file)
@@ -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) {