]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fs-metawrap: Fixed buffer size while reading metadata header.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 31 May 2016 19:33:32 +0000 (22:33 +0300)
committerGitLab <gitlab@git.dovecot.net>
Wed, 1 Jun 2016 09:20:15 +0000 (12:20 +0300)
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.

src/lib-fs/fs-metawrap.c
src/lib-fs/istream-metawrap.c

index c51d0e332a2ec3d2781ffa6c8f8850ec43e57678..e0185467773ddd7a010db44debd8ac9cf02f945d 100644 (file)
@@ -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);
index 859302d55bc0fbc80a82af1482bcec54091977ea..d5644fbb953f83b69bb5e010f97341aeff20af83 100644 (file)
@@ -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)