]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
global: Use i_stream_get_max_buffer_size() wherever possible
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 1 Jun 2016 15:11:29 +0000 (18:11 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 1 Jun 2016 16:43:19 +0000 (19:43 +0300)
After 7be8ba0c0 it's no longer correct to access stream->max_buffer_size
directly. These changes fix using istream-chain with various wrapper
streams.

13 files changed:
src/lib-compression/istream-bzlib.c
src/lib-compression/istream-lz4.c
src/lib-compression/istream-lzma.c
src/lib-compression/istream-zlib.c
src/lib-fs/istream-fs-file.c
src/lib-mail/istream-attachment-extractor.c
src/lib-mail/istream-binary-converter.c
src/lib-mail/istream-header-filter.c
src/lib-mail/istream-qp-decoder.c
src/lib-ssl-iostream/istream-openssl.c
src/lib-test/test-common.c
src/lib/istream-concat.c
src/lib/istream.c

index 26fb5ce2d6b6e36459840c4eaacd10416dd5d7ac..0ebca31f58d6ee55a9cc31b0f4629305b33cf2a5 100644 (file)
@@ -85,7 +85,7 @@ static ssize_t i_stream_bzlib_read(struct istream_private *stream)
                           have a seek mark. */
                        i_stream_compress(stream);
                }
-               if (stream->buffer_size < stream->max_buffer_size)
+               if (stream->buffer_size < i_stream_get_max_buffer_size(&stream->istream))
                        i_stream_grow_buffer(stream, CHUNK_SIZE);
 
                if (stream->pos == stream->buffer_size) {
index b7e072b9801be0d02b48011a835636b11933e736..2f169fbbb57e21ec707108bd38dd3c9ae2da2c2f 100644 (file)
@@ -148,7 +148,7 @@ static ssize_t i_stream_lz4_read(struct istream_private *stream)
        }
        /* if we already have max_buffer_size amount of data, fail here */
        i_stream_compress(stream);
-       if (stream->pos >= stream->max_buffer_size)
+       if (stream->pos >= i_stream_get_max_buffer_size(&stream->istream))
                return -2;
        /* allocate enough space for the old data and the new
           decompressed chunk. we don't know the original compressed size,
index c045cd1cb5fba1e8d4e873d7714b2078f25bf678..749858bcd6cd6f1d302968efa596f48861ab5566 100644 (file)
@@ -94,7 +94,7 @@ static ssize_t i_stream_lzma_read(struct istream_private *stream)
                           have a seek mark. */
                        i_stream_compress(stream);
                }
-               if (stream->buffer_size < stream->max_buffer_size)
+               if (stream->buffer_size < i_stream_get_max_buffer_size(&stream->istream))
                        i_stream_grow_buffer(stream, CHUNK_SIZE);
 
                if (stream->pos == stream->buffer_size) {
index d1bb9738499f61a0c0ebec213abbe2e0ed4132e9..dca544164cf0b77095c40912b6300c42f5319191 100644 (file)
@@ -229,7 +229,7 @@ static ssize_t i_stream_zlib_read(struct istream_private *stream)
                           have a seek mark. */
                        i_stream_compress(stream);
                }
-               if (stream->buffer_size < stream->max_buffer_size)
+               if (stream->buffer_size < i_stream_get_max_buffer_size(&stream->istream))
                        i_stream_grow_buffer(stream, CHUNK_SIZE);
 
                if (stream->pos == stream->buffer_size) {
index 4dc5c2d153c10bbf39264f4f0c3ebb48a9da9744..e7aecb3c13ebdedc4a89d691e28492051a9a9cf5 100644 (file)
@@ -27,7 +27,7 @@ static ssize_t i_stream_fs_file_read(struct istream_private *stream)
 
        if (fstream->istream.parent == NULL) {
                input = fs_read_stream(fstream->file,
-                                      fstream->istream.max_buffer_size);
+                       i_stream_get_max_buffer_size(&stream->istream));
                i_stream_init_parent(stream, input);
                i_stream_unref(&input);
        }
index 1b7831bba8029fa387c334aed846b57b1a073ab7..d0c130e3fcb51f5f38b7d1fd8088d4715fe8a301 100644 (file)
@@ -594,7 +594,7 @@ static int astream_read_next(struct attachment_istream *astream, bool *retry_r)
 
        *retry_r = FALSE;
 
-       if (stream->pos - stream->skip >= stream->max_buffer_size)
+       if (stream->pos - stream->skip >= i_stream_get_max_buffer_size(&stream->istream))
                return -2;
 
        if (astream->failed) {
index 56d1c7e6807c7d9c101ff45b324a363488bc786b..978380d2a51a00df678a27d6ffe774bce9dca8fa 100644 (file)
@@ -180,7 +180,7 @@ static ssize_t i_stream_binary_converter_read(struct istream_private *stream)
        struct message_block block;
        size_t old_size, new_size;
 
-       if (stream->pos - stream->skip >= stream->max_buffer_size)
+       if (stream->pos - stream->skip >= i_stream_get_max_buffer_size(&stream->istream))
                return -2;
        old_size = stream->pos - stream->skip;
 
index fa469d13bc40ce3fd03cd1264187747ec6ede7f9..7d30d64cf4edebdeffa2d92e21d97023504cffa4 100644 (file)
@@ -155,6 +155,7 @@ static ssize_t read_header(struct header_filter_istream *mstream)
 {
        struct message_header_line *hdr;
        uoff_t highwater_offset;
+       size_t max_buffer_size;
        ssize_t ret, ret2;
        int hdr_ret;
 
@@ -184,7 +185,8 @@ static ssize_t read_header(struct header_filter_istream *mstream)
                }
        }
 
-       if (mstream->hdr_buf->used >= mstream->istream.max_buffer_size)
+       max_buffer_size = i_stream_get_max_buffer_size(&mstream->istream.istream);
+       if (mstream->hdr_buf->used >= max_buffer_size)
                return -2;
 
        while ((hdr_ret = message_parse_header_next(mstream->hdr_ctx,
@@ -284,7 +286,7 @@ static ssize_t read_header(struct header_filter_istream *mstream)
                                break;
                        }
                }
-               if (mstream->hdr_buf->used >= mstream->istream.max_buffer_size)
+               if (mstream->hdr_buf->used >= max_buffer_size)
                        break;
        }
        if (mstream->hdr_buf->used > 0) {
index 4583f9b938cd2544c44213763dc83428ee996b1a..c77a91fef8cfce7275aeb529a7eca3e682ba3da1 100644 (file)
@@ -32,10 +32,11 @@ static ssize_t i_stream_qp_decoder_read(struct istream_private *stream)
        struct qp_decoder_istream *bstream =
                (struct qp_decoder_istream *)stream;
        const unsigned char *data;
-       size_t size, error_pos;
+       size_t size, error_pos, max_buffer_size;
        const char *error;
        int ret;
 
+       max_buffer_size = i_stream_get_max_buffer_size(&stream->istream);
        for (;;) {
                /* remove skipped data from buffer */
                if (stream->skip > 0) {
@@ -48,7 +49,7 @@ static ssize_t i_stream_qp_decoder_read(struct istream_private *stream)
                stream->buffer = bstream->buf->data;
 
                i_assert(stream->pos <= bstream->buf->used);
-               if (stream->pos >= bstream->istream.max_buffer_size) {
+               if (stream->pos >= max_buffer_size) {
                        /* stream buffer still at maximum */
                        return -2;
                }
@@ -60,8 +61,7 @@ static ssize_t i_stream_qp_decoder_read(struct istream_private *stream)
 
                        /* only return up to max_buffer_size bytes, even when buffer
                           actually has more, as not to confuse the caller */
-                       new_pos = I_MIN
-                               (bstream->buf->used, bstream->istream.max_buffer_size);
+                       new_pos = I_MIN(bstream->buf->used, max_buffer_size);
                        bytes = new_pos - stream->pos;
                        stream->pos = new_pos;
 
index bdfc21c9dd2e7b761ff46fb5fb893b6ba05a5e42..51b6c2659902f16797e27172ec9e6640adf81d69 100644 (file)
@@ -33,6 +33,7 @@ static ssize_t i_stream_ssl_read_real(struct istream_private *stream)
        struct ssl_istream *sstream = (struct ssl_istream *)stream;
        struct ssl_iostream *ssl_io = sstream->ssl_io;
        unsigned char buffer[IO_BLOCK_SIZE];
+       size_t max_buffer_size = i_stream_get_max_buffer_size(&stream->istream);
        size_t orig_max_buffer_size = stream->max_buffer_size;
        size_t size;
        ssize_t ret, total_ret;
@@ -42,9 +43,9 @@ static ssize_t i_stream_ssl_read_real(struct istream_private *stream)
                return -1;
        }
 
-       if (stream->pos >= stream->max_buffer_size) {
+       if (stream->pos >= max_buffer_size) {
                i_stream_compress(stream);
-               if (stream->pos >= stream->max_buffer_size)
+               if (stream->pos >= max_buffer_size)
                        return -2;
        }
 
@@ -62,9 +63,9 @@ static ssize_t i_stream_ssl_read_real(struct istream_private *stream)
 
        if (!i_stream_try_alloc(stream, 1, &size))
                i_unreached();
-       if (stream->pos + size > stream->max_buffer_size) {
-               i_assert(stream->max_buffer_size > stream->pos);
-               size = stream->max_buffer_size - stream->pos;
+       if (stream->pos + size > max_buffer_size) {
+               i_assert(max_buffer_size > stream->pos);
+               size = max_buffer_size - stream->pos;
        }
 
        while ((ret = SSL_read(ssl_io->ssl,
index aff3c230da829c32f1989926984064f649e0a637..04e61197acc474a6631e079278e412da2abf08bf 100644 (file)
@@ -38,8 +38,10 @@ static ssize_t test_read(struct istream_private *stream)
 
        i_assert(stream->skip <= stream->pos);
 
-       if (stream->pos - stream->skip >= tstream->istream.max_buffer_size)
+       if (stream->pos - stream->skip >= tstream->istream.max_buffer_size) {
+               i_assert(stream->skip != stream->pos);
                return -2;
+       }
 
        if (tstream->max_pos < stream->pos) {
                /* we seeked past the end of file. */
index fb9c20188ece9d7a50afaa8dcfe2f47a15c7a166..a69370457462d42d3ac3fbe814452320d262db76 100644 (file)
@@ -169,7 +169,7 @@ static ssize_t i_stream_concat_read(struct istream_private *stream)
                /* we either read something or we're at EOF */
                last_stream = cstream->input[cstream->cur_idx+1] == NULL;
                if (ret == -1 && !last_stream) {
-                       if (stream->pos - stream->skip >= stream->max_buffer_size)
+                       if (stream->pos - stream->skip >= i_stream_get_max_buffer_size(&stream->istream))
                                return -2;
 
                        i_stream_concat_read_next(cstream);
@@ -320,7 +320,7 @@ struct istream *i_stream_create_concat(struct istream *input[])
        /* if any of the streams isn't blocking or seekable, set ourself also
           nonblocking/nonseekable */
        for (count = 0; input[count] != NULL; count++) {
-               size_t cur_max = input[count]->real_stream->max_buffer_size;
+               size_t cur_max = i_stream_get_max_buffer_size(input[count]);
 
                if (cur_max > max_buffer_size)
                        max_buffer_size = cur_max;
index 83a4892d6285da7a1c25c46059613f19d8767eb2..8aa25defd2effc1bc6f05fa432f9edb642a049af 100644 (file)
@@ -605,9 +605,7 @@ void i_stream_compress(struct istream_private *stream)
 
 void i_stream_grow_buffer(struct istream_private *stream, size_t bytes)
 {
-       size_t old_size;
-
-       i_assert(stream->max_buffer_size > 0);
+       size_t old_size, max_size;
 
        old_size = stream->buffer_size;
 
@@ -617,8 +615,10 @@ void i_stream_grow_buffer(struct istream_private *stream, size_t bytes)
        else
                stream->buffer_size = nearest_power(stream->buffer_size);
 
-       if (stream->buffer_size > stream->max_buffer_size)
-               stream->buffer_size = stream->max_buffer_size;
+       max_size = i_stream_get_max_buffer_size(&stream->istream);
+       i_assert(max_size > 0);
+       if (stream->buffer_size > max_size)
+               stream->buffer_size = max_size;
 
        if (stream->buffer_size <= old_size)
                stream->buffer_size = old_size;
@@ -638,7 +638,7 @@ bool i_stream_try_alloc(struct istream_private *stream,
                if (stream->skip > 0) {
                        /* remove the unused bytes from beginning of buffer */
                         i_stream_compress(stream);
-               } else if (stream->buffer_size < stream->max_buffer_size) {
+               } else if (stream->buffer_size < i_stream_get_max_buffer_size(&stream->istream)) {
                        /* buffer is full - grow it */
                        i_stream_grow_buffer(stream, I_STREAM_MIN_SIZE);
                }