From: Timo Sirainen Date: Tue, 31 May 2016 19:33:32 +0000 (+0300) Subject: fs-metawrap: Fixed buffer size while reading metadata header. X-Git-Tag: 2.2.25.rc1~238 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9e7b4d66018c276bfe4feed3dd81244f198f0d91;p=thirdparty%2Fdovecot%2Fcore.git fs-metawrap: Fixed buffer size while reading metadata header. It's not enough to have the buffer size set to "large enough" at the time of the stream creation, because i_stream_set_max_buffer_size() could be called afterwards. --- diff --git a/src/lib-fs/fs-metawrap.c b/src/lib-fs/fs-metawrap.c index 1102c21c33..c2fd86677b 100644 --- a/src/lib-fs/fs-metawrap.c +++ b/src/lib-fs/fs-metawrap.c @@ -13,8 +13,6 @@ #include "iostream-temp.h" #include "fs-api-private.h" -#define MAX_METADATA_LINE_LEN 8192 - struct metawrap_fs { struct fs fs; bool wrap_metadata; @@ -283,8 +281,7 @@ fs_metawrap_read_stream(struct fs_file *_file, size_t max_buffer_size) return file->input; } - input = fs_read_stream(file->super_read, - I_MAX(max_buffer_size, MAX_METADATA_LINE_LEN)); + input = fs_read_stream(file->super_read, max_buffer_size); file->input = i_stream_create_metawrap(input, fs_metawrap_callback, file); i_stream_unref(&input); i_stream_ref(file->input); diff --git a/src/lib-fs/istream-metawrap.c b/src/lib-fs/istream-metawrap.c index edba22f124..5f4528136e 100644 --- a/src/lib-fs/istream-metawrap.c +++ b/src/lib-fs/istream-metawrap.c @@ -4,6 +4,8 @@ #include "istream-private.h" #include "istream-metawrap.h" +#define METAWRAP_MAX_METADATA_LINE_LEN 8192 + struct metawrap_istream { struct istream_private istream; metawrap_callback_t *callback; @@ -60,7 +62,12 @@ static ssize_t i_stream_metawrap_read(struct istream_private *stream) stream->istream.v_offset); if (mstream->in_metadata) { + size_t prev_max_size = i_stream_get_max_buffer_size(stream->parent); + + i_stream_set_max_buffer_size(stream->parent, METAWRAP_MAX_METADATA_LINE_LEN); ret = metadata_header_read(mstream); + i_stream_set_max_buffer_size(stream->parent, prev_max_size); + i_assert(stream->istream.v_offset == 0); mstream->start_offset = stream->parent->v_offset; if (ret <= 0)