Mercurial > dovecot > core-2.2
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)