]> 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)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 1 Jun 2016 10:39:16 +0000 (13:39 +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 1102c21c33682fe1772eb3889555be1ddd7c2a8d..c2fd86677b13fc47d6a1b8e228d9111206c56cfd 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 edba22f124dd75d28d5c7afd0abb7176b248eec7..5f4528136e47c39ef1c24bba4c2074e8ddf5ea7f 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)