]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-mail: return void from message_parser_deinit()
authorMartti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
Fri, 22 Apr 2016 09:37:29 +0000 (12:37 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 25 Apr 2016 19:20:28 +0000 (22:20 +0300)
src/doveadm/doveadm-mail-fetch.c
src/lib-imap/test-imap-bodystructure.c
src/lib-mail/istream-attachment-extractor.c
src/lib-mail/istream-binary-converter.c
src/lib-mail/message-parser.c
src/lib-mail/message-parser.h
src/lib-mail/message-snippet.c
src/lib-mail/test-message-parser.c
src/lib-mail/test-message-part.c

index d46aaa6910e9acbac2ad45a7943f2877a5bcd009..1b6a8c556d74f1743ca66bef039a7a39d8659935 100644 (file)
@@ -260,7 +260,7 @@ static int fetch_text_utf8(struct fetch_cmd_context *ctx)
        }
        i_assert(ret != 0);
        message_decoder_deinit(&decoder);
-       (void)message_parser_deinit(&parser, &parts);
+       message_parser_deinit(&parser, &parts);
 
        doveadm_print_stream("", 0);
        if (input->stream_errno != 0) {
index 7a328dd4d39d1e88b81204a5cdf5edc2d4275be8..0df8998b123e31cb7215f29675ac5e3f7ec1dcb4 100644 (file)
@@ -81,7 +81,7 @@ static struct message_part *msg_parse(pool_t pool, bool parse_bodystructure)
        }
        test_assert(ret < 0);
 
-       test_assert(message_parser_deinit(&parser, &parts) == 0);
+       message_parser_deinit(&parser, &parts);
        i_stream_unref(&input);
        return parts;
 }
index bc62146d24f0944d5c3e6e4f4ddfad3fedcea4d5..0810181255a9f7456ebd9dd15877a5192e4e3f42 100644 (file)
@@ -681,8 +681,7 @@ static void i_stream_attachment_extractor_close(struct iostream_private *stream,
        struct message_part *parts;
 
        if (astream->parser != NULL) {
-               if (message_parser_deinit(&astream->parser, &parts) < 0)
-                       i_unreached(); /* we didn't use preparsed message_parts */
+               message_parser_deinit(&astream->parser, &parts);
        }
        hash_format_deinit_free(&astream->set.hash_format);
        if (astream->pool != NULL)
index 87f2f419a13f05bb70891ec511c07eb86b94b2ab..56d1c7e6807c7d9c101ff45b324a363488bc786b 100644 (file)
@@ -275,8 +275,7 @@ static void i_stream_binary_converter_close(struct iostream_private *stream,
        struct message_part *parts;
 
        if (bstream->parser != NULL) {
-               if (message_parser_deinit(&bstream->parser, &parts) < 0)
-                       i_unreached(); /* we didn't use preparsed message_parts */
+               message_parser_deinit(&bstream->parser, &parts);
        }
        if (bstream->pool != NULL)
                pool_unref(&bstream->pool);
index e3e712a298d765bb32d3572c23f7d23cc3462ac7..7f8e588d8333d03ed979c057a7a8653b6295798a 100644 (file)
@@ -46,6 +46,7 @@ struct message_parser_ctx {
 
        unsigned int part_seen_content_type:1;
        unsigned int multipart:1;
+       unsigned int preparsed:1;
        unsigned int eof:1;
 };
 
@@ -1057,17 +1058,20 @@ message_parser_init_from_parts(struct message_part *parts,
        i_assert(parts != NULL);
 
        ctx = message_parser_init_int(input, hdr_flags, flags);
+       ctx->preparsed = TRUE;
        ctx->parts = ctx->part = parts;
        ctx->parse_next_block = preparsed_parse_next_header_init;
        return ctx;
 }
 
-int message_parser_deinit(struct message_parser_ctx **_ctx,
+void message_parser_deinit(struct message_parser_ctx **_ctx,
                          struct message_part **parts_r)
 {
        const char *error;
 
-       return message_parser_deinit_from_parts(_ctx, parts_r, &error);
+       i_assert((**_ctx).preparsed == FALSE);
+       if (message_parser_deinit_from_parts(_ctx, parts_r, &error) < 0)
+               i_panic("message_parser_deinit_from_parts: %s", error);
 }
 
 int message_parser_deinit_from_parts(struct message_parser_ctx **_ctx,
index fe93fc37d60e0228332a27195d106121a6440e71..1d4ca12fd9ca9a479a07fbf6c2c356bc2af92b90 100644 (file)
@@ -47,16 +47,16 @@ struct message_parser_ctx *
 message_parser_init(pool_t part_pool, struct istream *input,
                    enum message_header_parser_flags hdr_flags,
                    enum message_parser_flags flags);
+/* Deinitialize message parser. The ctx must NOT have been created by
+   message_parser_init_from_parts(). */
+void message_parser_deinit(struct message_parser_ctx **ctx,
+                          struct message_part **parts_r);
 /* Use preparsed parts to speed up parsing. */
 struct message_parser_ctx *
 message_parser_init_from_parts(struct message_part *parts,
                               struct istream *input,
                               enum message_header_parser_flags hdr_flags,
                               enum message_parser_flags flags);
-/* Returns 0 if parts were returned, -1 we used preparsed parts and they
-   didn't match the current message */
-int message_parser_deinit(struct message_parser_ctx **ctx,
-                         struct message_part **parts_r);
 /* Same as message_parser_deinit(), but return an error message describing
    why the preparsed parts didn't match the message. This can also safely be
    called even when preparsed parts weren't used - it'll always just return
index 17a4da8540c9f19e50070845348cc72c7369798d..bfd20ce2af2b4108ddb8dfd6cc0d0e708ca9c697 100644 (file)
@@ -127,8 +127,7 @@ int message_snippet_generate(struct istream *input,
        }
        i_assert(ret != 0);
        message_decoder_deinit(&decoder);
-       if (message_parser_deinit(&parser, &parts) < 0)
-               i_unreached();
+       message_parser_deinit(&parser, &parts);
        if (ctx.html2text != NULL)
                mail_html2text_deinit(&ctx.html2text);
        pool_unref(&pool);
index 5df4b1387b27f71171fac21c5c09349661abf928..d682fcfcce071d44cac367df7dfec391b70071d4 100644 (file)
@@ -77,6 +77,7 @@ static void test_message_parser_small_blocks(void)
        unsigned int i, end_of_headers_idx;
        string_t *output;
        pool_t pool;
+       const char *error;
        int ret;
 
        test_begin("message parser in small blocks");
@@ -96,7 +97,7 @@ static void test_message_parser_small_blocks(void)
        }
 
        test_assert(ret < 0);
-       test_assert(message_parser_deinit(&parser, &parts) == 0);
+       message_parser_deinit(&parser, &parts);
        test_assert(strcmp(test_msg, str_c(output)) == 0);
 
        /* parsing in small blocks */
@@ -113,7 +114,7 @@ static void test_message_parser_small_blocks(void)
                test_assert((ret == 0 && i <= TEST_MSG_LEN*2) ||
                            (ret < 0 && i > TEST_MSG_LEN*2));
        }
-       test_assert(message_parser_deinit(&parser, &parts2) == 0);
+       message_parser_deinit(&parser, &parts2);
        test_assert(msg_parts_cmp(parts, parts2));
 
        /* parsing in small blocks from preparsed parts */
@@ -132,7 +133,7 @@ static void test_message_parser_small_blocks(void)
                test_assert((ret == 0 && i/2 <= end_of_headers_idx) ||
                            (ret < 0 && i/2 > end_of_headers_idx));
        }
-       test_assert(message_parser_deinit(&parser, &parts2) == 0);
+       test_assert(message_parser_deinit_from_parts(&parser, &parts2, &error) == 0);
        test_assert(msg_parts_cmp(parts, parts2));
 
        i_stream_unref(&input);
@@ -167,7 +168,7 @@ static const char 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);
+       message_parser_deinit(&parser, &parts);
 
        test_assert((parts->flags & MESSAGE_PART_FLAG_MULTIPART) != 0);
        test_assert(parts->body_size.lines == 8);
@@ -222,7 +223,7 @@ static const char 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);
+       message_parser_deinit(&parser, &parts);
 
        test_assert(parts->flags == (MESSAGE_PART_FLAG_MULTIPART | MESSAGE_PART_FLAG_IS_MIME));
        test_assert(parts->header_size.lines == 2);
@@ -274,7 +275,7 @@ static const char 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);
+       message_parser_deinit(&parser, &parts);
 
        test_assert(parts->flags == (MESSAGE_PART_FLAG_MULTIPART | MESSAGE_PART_FLAG_IS_MIME));
        test_assert(parts->header_size.lines == 1);
@@ -310,7 +311,7 @@ static const char 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);
+       message_parser_deinit(&parser, &parts);
 
        test_assert(parts->flags == (MESSAGE_PART_FLAG_MULTIPART | MESSAGE_PART_FLAG_IS_MIME));
        test_assert(parts->header_size.lines == 2);
@@ -353,7 +354,7 @@ static const char 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);
+       message_parser_deinit(&parser, &parts);
 
        test_assert(parts->flags == (MESSAGE_PART_FLAG_MULTIPART | MESSAGE_PART_FLAG_IS_MIME));
        test_assert(parts->header_size.lines == 2);
@@ -410,7 +411,7 @@ static const char 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);
+       message_parser_deinit(&parser, &parts);
 
        test_assert(parts->flags == (MESSAGE_PART_FLAG_MULTIPART | MESSAGE_PART_FLAG_IS_MIME));
        test_assert(parts->header_size.lines == 2);
@@ -467,7 +468,7 @@ static const char 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);
+       message_parser_deinit(&parser, &parts);
 
        test_assert(parts->flags == (MESSAGE_PART_FLAG_MULTIPART | MESSAGE_PART_FLAG_IS_MIME));
        test_assert(parts->header_size.lines == 2);
@@ -518,7 +519,7 @@ static void test_message_parser_no_eoh(void)
        test_assert(message_parser_parse_next_block(parser, &block) > 0 &&
                    block.hdr == NULL && block.size == 0);
        test_assert(message_parser_parse_next_block(parser, &block) < 0);
-       test_assert(message_parser_deinit(&parser, &parts) == 0);
+       message_parser_deinit(&parser, &parts);
 
        i_stream_unref(&input);
        pool_unref(&pool);
index b9404c0e959086f5a4aacc929ac3c1fa49a333ab..b898f8aa458714af4167a0455ea9f57ae6c0409a 100644 (file)
@@ -84,7 +84,7 @@ static void test_message_part_idx(void)
                prev_idx = part_idx;
        }
        test_assert(ret < 0);
-       test_assert(message_parser_deinit(&parser, &parts) == 0);
+       message_parser_deinit(&parser, &parts);
 
        part = message_part_by_idx(parts, 0);
        test_assert(part == parts);