From: Timo Sirainen Date: Wed, 1 Jun 2016 15:11:29 +0000 (+0300) Subject: global: Use i_stream_get_max_buffer_size() wherever possible X-Git-Tag: 2.3.0.rc1~3591 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0928812e725cd3a4debab2a93d0c9b0436a4de9f;p=thirdparty%2Fdovecot%2Fcore.git global: Use i_stream_get_max_buffer_size() wherever possible After 7be8ba0c0 it's no longer correct to access stream->max_buffer_size directly. These changes fix using istream-chain with various wrapper streams. --- diff --git a/src/lib-compression/istream-bzlib.c b/src/lib-compression/istream-bzlib.c index 26fb5ce2d6..0ebca31f58 100644 --- a/src/lib-compression/istream-bzlib.c +++ b/src/lib-compression/istream-bzlib.c @@ -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) { diff --git a/src/lib-compression/istream-lz4.c b/src/lib-compression/istream-lz4.c index b7e072b980..2f169fbbb5 100644 --- a/src/lib-compression/istream-lz4.c +++ b/src/lib-compression/istream-lz4.c @@ -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, diff --git a/src/lib-compression/istream-lzma.c b/src/lib-compression/istream-lzma.c index c045cd1cb5..749858bcd6 100644 --- a/src/lib-compression/istream-lzma.c +++ b/src/lib-compression/istream-lzma.c @@ -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) { diff --git a/src/lib-compression/istream-zlib.c b/src/lib-compression/istream-zlib.c index d1bb973849..dca544164c 100644 --- a/src/lib-compression/istream-zlib.c +++ b/src/lib-compression/istream-zlib.c @@ -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) { diff --git a/src/lib-fs/istream-fs-file.c b/src/lib-fs/istream-fs-file.c index 4dc5c2d153..e7aecb3c13 100644 --- a/src/lib-fs/istream-fs-file.c +++ b/src/lib-fs/istream-fs-file.c @@ -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); } diff --git a/src/lib-mail/istream-attachment-extractor.c b/src/lib-mail/istream-attachment-extractor.c index 1b7831bba8..d0c130e3fc 100644 --- a/src/lib-mail/istream-attachment-extractor.c +++ b/src/lib-mail/istream-attachment-extractor.c @@ -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) { diff --git a/src/lib-mail/istream-binary-converter.c b/src/lib-mail/istream-binary-converter.c index 56d1c7e680..978380d2a5 100644 --- a/src/lib-mail/istream-binary-converter.c +++ b/src/lib-mail/istream-binary-converter.c @@ -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; diff --git a/src/lib-mail/istream-header-filter.c b/src/lib-mail/istream-header-filter.c index fa469d13bc..7d30d64cf4 100644 --- a/src/lib-mail/istream-header-filter.c +++ b/src/lib-mail/istream-header-filter.c @@ -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) { diff --git a/src/lib-mail/istream-qp-decoder.c b/src/lib-mail/istream-qp-decoder.c index 4583f9b938..c77a91fef8 100644 --- a/src/lib-mail/istream-qp-decoder.c +++ b/src/lib-mail/istream-qp-decoder.c @@ -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; diff --git a/src/lib-ssl-iostream/istream-openssl.c b/src/lib-ssl-iostream/istream-openssl.c index bdfc21c9dd..51b6c26599 100644 --- a/src/lib-ssl-iostream/istream-openssl.c +++ b/src/lib-ssl-iostream/istream-openssl.c @@ -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, diff --git a/src/lib-test/test-common.c b/src/lib-test/test-common.c index aff3c230da..04e61197ac 100644 --- a/src/lib-test/test-common.c +++ b/src/lib-test/test-common.c @@ -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. */ diff --git a/src/lib/istream-concat.c b/src/lib/istream-concat.c index fb9c20188e..a693704574 100644 --- a/src/lib/istream-concat.c +++ b/src/lib/istream-concat.c @@ -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; diff --git a/src/lib/istream.c b/src/lib/istream.c index 83a4892d62..8aa25defd2 100644 --- a/src/lib/istream.c +++ b/src/lib/istream.c @@ -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); }