]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-mail: Improved test-message-parser further
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 22 Apr 2016 15:35:04 +0000 (18:35 +0300)
committerGitLab <gitlab@git.dovecot.net>
Fri, 22 Apr 2016 22:43:53 +0000 (01:43 +0300)
src/lib-mail/test-message-parser.c

index c613bb5306491b22dd35f883d4a48ef9f1dfdf4f..5df4b1387b27f71171fac21c5c09349661abf928 100644 (file)
@@ -290,6 +290,43 @@ static const char input_msg[] =
        test_end();
 }
 
+static void test_message_parser_empty_multipart(void)
+{
+static const char input_msg[] =
+"Content-Type: multipart/mixed; boundary=\"ab\"\n"
+"\n"
+"body\n";
+       struct message_parser_ctx *parser;
+       struct istream *input;
+       struct message_part *parts;
+       struct message_block block;
+       pool_t pool;
+       int ret;
+
+       test_begin("message parser truncated mime headers 3");
+       pool = pool_alloconly_create("message parser", 10240);
+       input = test_istream_create(input_msg);
+
+       parser = message_parser_init(pool, input, 0, 0);
+       while ((ret = message_parser_parse_next_block(parser, &block)) > 0) ;
+       test_assert(ret < 0);
+       test_assert(message_parser_deinit(&parser, &parts) == 0);
+
+       test_assert(parts->flags == (MESSAGE_PART_FLAG_MULTIPART | MESSAGE_PART_FLAG_IS_MIME));
+       test_assert(parts->header_size.lines == 2);
+       test_assert(parts->header_size.physical_size == 46);
+       test_assert(parts->header_size.virtual_size == 46+2);
+       test_assert(parts->body_size.lines == 1);
+       test_assert(parts->body_size.physical_size == 5);
+       test_assert(parts->body_size.virtual_size == 5+1);
+
+       test_assert(parts->children == NULL);
+
+       i_stream_unref(&input);
+       pool_unref(&pool);
+       test_end();
+}
+
 static void test_message_parser_duplicate_mime_boundary(void)
 {
 static const char input_msg[] =
@@ -347,6 +384,63 @@ static const char input_msg[] =
        test_end();
 }
 
+static void test_message_parser_garbage_suffix_mime_boundary(void)
+{
+static const char input_msg[] =
+"Content-Type: multipart/mixed; boundary=\"a\"\n"
+"\n"
+"--ab\n"
+"Content-Type: multipart/mixed; boundary=\"a\"\n"
+"\n"
+"--ac\n"
+"Content-Type: text/plain\n"
+"\n"
+"body\n";
+       struct message_parser_ctx *parser;
+       struct istream *input;
+       struct message_part *parts;
+       struct message_block block;
+       pool_t pool;
+       int ret;
+
+       test_begin("message parser garbage suffix mime boundary");
+       pool = pool_alloconly_create("message parser", 10240);
+       input = test_istream_create(input_msg);
+
+       parser = message_parser_init(pool, input, 0, 0);
+       while ((ret = message_parser_parse_next_block(parser, &block)) > 0) ;
+       test_assert(ret < 0);
+       test_assert(message_parser_deinit(&parser, &parts) == 0);
+
+       test_assert(parts->flags == (MESSAGE_PART_FLAG_MULTIPART | MESSAGE_PART_FLAG_IS_MIME));
+       test_assert(parts->header_size.lines == 2);
+       test_assert(parts->header_size.physical_size == 45);
+       test_assert(parts->header_size.virtual_size == 45+2);
+       test_assert(parts->body_size.lines == 7);
+       test_assert(parts->body_size.physical_size == 86);
+       test_assert(parts->body_size.virtual_size == 86+7);
+       test_assert(parts->children->flags == (MESSAGE_PART_FLAG_MULTIPART | MESSAGE_PART_FLAG_IS_MIME));
+       test_assert(parts->children->physical_pos == 50);
+       test_assert(parts->children->header_size.lines == 2);
+       test_assert(parts->children->header_size.physical_size == 45);
+       test_assert(parts->children->header_size.virtual_size == 45+2);
+       test_assert(parts->children->body_size.lines == 4);
+       test_assert(parts->children->body_size.physical_size == 36);
+       test_assert(parts->children->body_size.virtual_size == 36+4);
+       test_assert(parts->children->children->flags == (MESSAGE_PART_FLAG_TEXT | MESSAGE_PART_FLAG_IS_MIME));
+       test_assert(parts->children->children->physical_pos == 100);
+       test_assert(parts->children->children->header_size.lines == 2);
+       test_assert(parts->children->children->header_size.physical_size == 26);
+       test_assert(parts->children->children->header_size.virtual_size == 26+2);
+       test_assert(parts->children->children->body_size.lines == 1);
+       test_assert(parts->children->children->body_size.physical_size == 5);
+       test_assert(parts->children->children->body_size.virtual_size == 5+1);
+
+       i_stream_unref(&input);
+       pool_unref(&pool);
+       test_end();
+}
+
 static void test_message_parser_continuing_mime_boundary(void)
 {
 static const char input_msg[] =
@@ -438,7 +532,9 @@ int main(void)
                test_message_parser_truncated_mime_headers,
                test_message_parser_truncated_mime_headers2,
                test_message_parser_truncated_mime_headers3,
+               test_message_parser_empty_multipart,
                test_message_parser_duplicate_mime_boundary,
+               test_message_parser_garbage_suffix_mime_boundary,
                test_message_parser_continuing_mime_boundary,
                test_message_parser_no_eoh,
                NULL