changeset 20232:2ae2e3beaa56

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.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Tue, 31 May 2016 22:33:32 +0300
parents f0b26fed18b6
children 4309b9bad6d9
files src/lib-fs/fs-metawrap.c src/lib-fs/istream-metawrap.c
diffstat 2 files changed, 8 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-fs/fs-metawrap.c	Tue May 31 22:19:37 2016 +0300
+++ b/src/lib-fs/fs-metawrap.c	Tue May 31 22:33:32 2016 +0300
@@ -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 @@
 		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);
--- a/src/lib-fs/istream-metawrap.c	Tue May 31 22:19:37 2016 +0300
+++ b/src/lib-fs/istream-metawrap.c	Tue May 31 22:33:32 2016 +0300
@@ -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 @@
 		      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)