changeset 21692:ce8b35e40712

lib-mail: Make sure istream-attachment-connector detects wrong mail size.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Tue, 01 Nov 2016 18:42:31 +0200
parents 6e5ac036ed73
children c00c65eb641a
files src/lib-mail/istream-attachment-connector.c src/lib-mail/test-istream-attachment.c
diffstat 2 files changed, 47 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-mail/istream-attachment-connector.c	Fri Dec 23 14:15:49 2016 -0500
+++ b/src/lib-mail/istream-attachment-connector.c	Tue Nov 01 18:42:31 2016 +0200
@@ -65,9 +65,10 @@
 
 	if (base_prefix_size > 0) {
 		/* add a part of the base message before the attachment */
-		input = i_stream_create_range(conn->base_input,
-					      conn->base_input_offset,
-					      base_prefix_size);
+		input = i_stream_create_min_sized_range(conn->base_input,
+			conn->base_input_offset, base_prefix_size);
+		i_stream_set_name(input, t_strdup_printf("%s middle",
+			i_stream_get_name(conn->base_input)));
 		array_append(&conn->streams, &input, 1);
 		conn->base_input_offset += base_prefix_size;
 		conn->encoded_offset += base_prefix_size;
@@ -119,9 +120,11 @@
 		i_assert(conn->base_input_offset < conn->msg_size);
 
 		trailer_size = conn->msg_size - conn->encoded_offset;
-		input = i_stream_create_range(conn->base_input,
-					      conn->base_input_offset,
-					      trailer_size);
+		input = i_stream_create_sized_range(conn->base_input,
+						    conn->base_input_offset,
+						    trailer_size);
+		i_stream_set_name(input, t_strdup_printf(
+			"%s trailer", i_stream_get_name(conn->base_input)));
 		array_append(&conn->streams, &input, 1);
 	}
 	array_append_zero(&conn->streams);
--- a/src/lib-mail/test-istream-attachment.c	Fri Dec 23 14:15:49 2016 -0500
+++ b/src/lib-mail/test-istream-attachment.c	Tue Nov 01 18:42:31 2016 +0200
@@ -279,21 +279,36 @@
 	i_stream_unref(&input2);
 
 	/* rebuild the original stream and see if the hash matches */
-	input2 = i_stream_create_from_data(base_buf->data, base_buf->used);
-	input = test_build_original_istream(input2, msg_size);
-	i_stream_unref(&input2);
+	{
+		input2 = i_stream_create_from_data(base_buf->data, base_buf->used);
+		input = test_build_original_istream(input2, msg_size);
+		i_stream_unref(&input2);
+
+		sha1_init(&hash);
+		while (i_stream_read_more(input, &data, &size) > 0) {
+			sha1_loop(&hash, data, size);
+			i_stream_skip(input, size);
+		}
+		test_assert(input->eof && input->stream_errno == 0);
+		sha1_result(&hash, hash_attached);
+		i_stream_unref(&input);
 
-	sha1_init(&hash);
-	while (i_stream_read_data(input, &data, &size, 0) > 0) {
-		sha1_loop(&hash, data, size);
-		i_stream_skip(input, size);
+		if (memcmp(hash_file, hash_attached, SHA1_RESULTLEN) != 0)
+			ret = -1;
 	}
-	sha1_result(&hash, hash_attached);
-	i_stream_unref(&input);
 
-	ret = memcmp(hash_file, hash_attached, SHA1_RESULTLEN) == 0 ? 0 : -1;
+	/* try with a wrong message size */
+	for (int i = 0; i < 2; i++) {
+		input2 = i_stream_create_from_data(base_buf->data, base_buf->used);
+		input = test_build_original_istream(input2, msg_size +
+						    (i == 0 ? 1 : -1));
+		i_stream_unref(&input2);
+		while (i_stream_read_more(input, &data, &size) > 0)
+			i_stream_skip(input, size);
+		test_assert(input->stream_errno == (i == 0 ? EPIPE : EINVAL));
+		i_stream_unref(&input);
+	}
 
-	i_stream_unref(&file_input);
 	buffer_free(&base_buf);
 	if (attachment_data != NULL)
 		buffer_free(&attachment_data);
@@ -425,6 +440,17 @@
 	test_end();
 }
 
+static void test_istream_attachment_connector(void)
+{
+	struct istream *input;
+
+	test_begin("istream attachment connector");
+	input = i_stream_create_from_data(mail_input, sizeof(mail_input));
+	test_assert(test_input_stream(input) == 0);
+	i_stream_unref(&input);
+	test_end();
+}
+
 static int test_input_file(const char *path)
 {
 	struct istream *file_input;
@@ -450,6 +476,7 @@
 		test_istream_attachment,
 		test_istream_attachment_extractor,
 		test_istream_attachment_extractor_error,
+		test_istream_attachment_connector,
 		NULL
 	};
 	if (argc > 1)