]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-mail: Change message_address to be doubly linked list
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Sat, 3 Feb 2024 22:26:57 +0000 (00:26 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 7 Aug 2024 11:55:39 +0000 (14:55 +0300)
src/lib-imap/imap-envelope.c
src/lib-mail/message-address.c
src/lib-mail/message-address.h
src/lib-mail/test-message-address.c

index 87297f4f691a739a4b2ad2f5e2c25617987482bc..1312eae2ff303954c694c58f227c7160e1e1d301 100644 (file)
@@ -1,6 +1,7 @@
 /* Copyright (c) 2002-2018 Dovecot authors, see the included COPYING file */
 
 #include "lib.h"
+#include "llist.h"
 #include "istream.h"
 #include "str.h"
 #include "message-address.h"
@@ -127,7 +128,7 @@ static bool
 imap_envelope_parse_addresses(const struct imap_arg *arg,
        pool_t pool, struct message_address **addrs_r)
 {
-       struct message_address *first, *addr, *prev;
+       struct message_address *first, *last, *addr;
        const struct imap_arg *list_args;
 
        if (arg->type == IMAP_ARG_NIL) {
@@ -138,16 +139,12 @@ imap_envelope_parse_addresses(const struct imap_arg *arg,
        if (!imap_arg_get_list(arg, &list_args))
                return FALSE;
 
-       first = addr = prev = NULL;
+       first = last = addr = NULL;
        for (; !IMAP_ARG_IS_EOL(list_args); list_args++) {
                if (!imap_envelope_parse_address
                        (list_args, pool, &addr))
                        return FALSE;
-               if (first == NULL)
-                       first = addr;
-               if (prev != NULL)
-                       prev->next = addr;
-               prev = addr;
+               DLLIST2_APPEND(&first, &last, addr);
        }
 
        *addrs_r = first;
index fb06afae7b757829b793e065a1b370c178a68147..9d192799468cfc07aa50f1bb03077b48abf9165e 100644 (file)
@@ -1,6 +1,7 @@
 /* Copyright (c) 2002-2018 Dovecot authors, see the included COPYING file */
 
 #include "lib.h"
+#include "llist.h"
 #include "str.h"
 #include "strescape.h"
 #include "smtp-address.h"
@@ -27,11 +28,7 @@ static void add_address(struct message_address_parser_context *ctx)
        memcpy(addr, &ctx->addr, sizeof(ctx->addr));
        i_zero(&ctx->addr);
 
-       if (ctx->first_addr == NULL)
-               ctx->first_addr = addr;
-       else
-               ctx->last_addr->next = addr;
-       ctx->last_addr = addr;
+       DLLIST2_APPEND(&ctx->first_addr, &ctx->last_addr, addr);
 }
 
 /* quote with "" and escape all '\', '"' and "'" characters if need */
@@ -631,6 +628,7 @@ const char *message_address_first_to_string(const struct message_address *addr)
        struct message_address first_addr;
 
        first_addr = *addr;
+       first_addr.prev = NULL;
        first_addr.next = NULL;
        first_addr.route = NULL;
        return message_address_to_string(&first_addr);
index 8370397741cbde6b90b9253ccd111d4b889829c8..85cff3dcc6f6ddcb3ee6f45b9882656ae710d1db 100644 (file)
@@ -18,7 +18,7 @@ enum message_address_parse_flags {
    {name = NULL, NULL, "group", NULL}, ..., {NULL, NULL, NULL, NULL}
 */
 struct message_address {
-       struct message_address *next;
+       struct message_address *prev, *next;
 
        /* display-name */
        const char *name;
index e6204bb058852eb194e1e3109ccf0b3875210096..261cbfba70afe5d637530237f1ab7f188eee4931 100644 (file)
@@ -47,174 +47,174 @@ static void test_message_address(void)
        } tests[] = {
                /* user@domain -> <user@domain> */
                { "user@domain", "<user@domain>", NULL,
-                 { NULL, NULL, NULL, "user", "domain", FALSE },
-                 { NULL, NULL, NULL, "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, NULL, "user", "domain", FALSE },
+                 { NULL, NULL, NULL, NULL, "user", "domain", FALSE }, 0 },
                { "\"user\"@domain", "<user@domain>", NULL,
-                 { NULL, NULL, NULL, "user", "domain", FALSE },
-                 { NULL, NULL, NULL, "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, NULL, "user", "domain", FALSE },
+                 { NULL, NULL, NULL, NULL, "user", "domain", FALSE }, 0 },
                { "\"user name\"@domain", "<\"user name\"@domain>", NULL,
-                 { NULL, NULL, NULL, "user name", "domain", FALSE },
-                 { NULL, NULL, NULL, "user name", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, NULL, "user name", "domain", FALSE },
+                 { NULL, NULL, NULL, NULL, "user name", "domain", FALSE }, 0 },
                { "\"user@na\\\\me\"@domain", "<\"user@na\\\\me\"@domain>", NULL,
-                 { NULL, NULL, NULL, "user@na\\me", "domain", FALSE },
-                 { NULL, NULL, NULL, "user@na\\me", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, NULL, "user@na\\me", "domain", FALSE },
+                 { NULL, NULL, NULL, NULL, "user@na\\me", "domain", FALSE }, 0 },
                { "\"user\\\"name\"@domain", "<\"user\\\"name\"@domain>", NULL,
-                 { NULL, NULL, NULL, "user\"name", "domain", FALSE },
-                 { NULL, NULL, NULL, "user\"name", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, NULL, "user\"name", "domain", FALSE },
+                 { NULL, NULL, NULL, NULL, "user\"name", "domain", FALSE }, 0 },
                { "\"\"@domain", "<\"\"@domain>", NULL,
-                 { NULL, NULL, NULL, "", "domain", FALSE },
-                 { NULL, NULL, NULL, "", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, NULL, "", "domain", FALSE },
+                 { NULL, NULL, NULL, NULL, "", "domain", FALSE }, 0 },
                { "user", "<user>", "<user@MISSING_DOMAIN>",
-                 { NULL, NULL, NULL, "user", "", TRUE },
-                 { NULL, NULL, NULL, "user", "MISSING_DOMAIN", TRUE }, 0 },
+                 { NULL, NULL, NULL, NULL, "user", "", TRUE },
+                 { NULL, NULL, NULL, NULL, "user", "MISSING_DOMAIN", TRUE }, 0 },
                { "@domain", "<\"\"@domain>", "<MISSING_MAILBOX@domain>",
-                 { NULL, NULL, NULL, "", "domain", TRUE },
-                 { NULL, NULL, NULL, "MISSING_MAILBOX", "domain", TRUE }, 0 },
+                 { NULL, NULL, NULL, NULL, "", "domain", TRUE },
+                 { NULL, NULL, NULL, NULL, "MISSING_MAILBOX", "domain", TRUE }, 0 },
 
                /* Display Name -> Display Name */
                { "Display Name", "\"Display Name\"", "\"Display Name\" <MISSING_MAILBOX@MISSING_DOMAIN>",
-                 { NULL, "Display Name", NULL, "", "", TRUE },
-                 { NULL, "Display Name", NULL, "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE }, 0 },
+                 { NULL, NULL, "Display Name", NULL, "", "", TRUE },
+                 { NULL, NULL, "Display Name", NULL, "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE }, 0 },
                { "\"Display Name\"", "\"Display Name\"", "\"Display Name\" <MISSING_MAILBOX@MISSING_DOMAIN>",
-                 { NULL, "Display Name", NULL, "", "", TRUE },
-                 { NULL, "Display Name", NULL, "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE }, 0 },
+                 { NULL, NULL, "Display Name", NULL, "", "", TRUE },
+                 { NULL, NULL, "Display Name", NULL, "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE }, 0 },
                { "Display \"Name\"", "\"Display Name\"", "\"Display Name\" <MISSING_MAILBOX@MISSING_DOMAIN>",
-                 { NULL, "Display Name", NULL, "", "", TRUE },
-                 { NULL, "Display Name", NULL, "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE }, 0 },
+                 { NULL, NULL, "Display Name", NULL, "", "", TRUE },
+                 { NULL, NULL, "Display Name", NULL, "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE }, 0 },
                { "\"Display\" \"Name\"", "\"Display Name\"", "\"Display Name\" <MISSING_MAILBOX@MISSING_DOMAIN>",
-                 { NULL, "Display Name", NULL, "", "", TRUE },
-                 { NULL, "Display Name", NULL, "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE }, 0 },
+                 { NULL, NULL, "Display Name", NULL, "", "", TRUE },
+                 { NULL, NULL, "Display Name", NULL, "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE }, 0 },
                { "\"\"", "", "<MISSING_MAILBOX@MISSING_DOMAIN>",
-                 { NULL, "", NULL, "", "", TRUE },
-                 { NULL, "", NULL, "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE }, 0 },
+                 { NULL, NULL, "", NULL, "", "", TRUE },
+                 { NULL, NULL, "", NULL, "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE }, 0 },
 
                /* <user@domain> -> <user@domain> */
                { "<user@domain>", NULL, NULL,
-                 { NULL, NULL, NULL, "user", "domain", FALSE },
-                 { NULL, NULL, NULL, "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, NULL, "user", "domain", FALSE },
+                 { NULL, NULL, NULL, NULL, "user", "domain", FALSE }, 0 },
                { "<\"user\"@domain>", "<user@domain>", NULL,
-                 { NULL, NULL, NULL, "user", "domain", FALSE },
-                 { NULL, NULL, NULL, "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, NULL, "user", "domain", FALSE },
+                 { NULL, NULL, NULL, NULL, "user", "domain", FALSE }, 0 },
                { "<\"user name\"@domain>", NULL, NULL,
-                 { NULL, NULL, NULL, "user name", "domain", FALSE },
-                 { NULL, NULL, NULL, "user name", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, NULL, "user name", "domain", FALSE },
+                 { NULL, NULL, NULL, NULL, "user name", "domain", FALSE }, 0 },
                { "<\"user@na\\\\me\"@domain>", NULL, NULL,
-                 { NULL, NULL, NULL, "user@na\\me", "domain", FALSE },
-                 { NULL, NULL, NULL, "user@na\\me", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, NULL, "user@na\\me", "domain", FALSE },
+                 { NULL, NULL, NULL, NULL, "user@na\\me", "domain", FALSE }, 0 },
                { "<\"user\\\"name\"@domain>", NULL, NULL,
-                 { NULL, NULL, NULL, "user\"name", "domain", FALSE },
-                 { NULL, NULL, NULL, "user\"name", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, NULL, "user\"name", "domain", FALSE },
+                 { NULL, NULL, NULL, NULL, "user\"name", "domain", FALSE }, 0 },
                { "<\"\"@domain>", NULL, NULL,
-                 { NULL, NULL, NULL, "", "domain", FALSE },
-                 { NULL, NULL, NULL, "", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, NULL, "", "domain", FALSE },
+                 { NULL, NULL, NULL, NULL, "", "domain", FALSE }, 0 },
                { "<user>", NULL, "<user@MISSING_DOMAIN>",
-                 { NULL, NULL, NULL, "user", "", TRUE },
-                 { NULL, NULL, NULL, "user", "MISSING_DOMAIN", TRUE }, 0 },
+                 { NULL, NULL, NULL, NULL, "user", "", TRUE },
+                 { NULL, NULL, NULL, NULL, "user", "MISSING_DOMAIN", TRUE }, 0 },
                { "<@route>", "<@route:\"\">", "<INVALID_ROUTE:MISSING_MAILBOX@MISSING_DOMAIN>",
-                 { NULL, NULL, "@route", "", "", TRUE },
-                 { NULL, NULL, "INVALID_ROUTE", "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE }, 0 },
+                 { NULL, NULL, NULL, "@route", "", "", TRUE },
+                 { NULL, NULL, NULL, "INVALID_ROUTE", "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE }, 0 },
 
                /* user@domain (Display Name) -> "Display Name" <user@domain> */
                { "user@domain (DisplayName)", "DisplayName <user@domain>", NULL,
-                 { NULL, "DisplayName", NULL, "user", "domain", FALSE },
-                 { NULL, "DisplayName", NULL, "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, "DisplayName", NULL, "user", "domain", FALSE },
+                 { NULL, NULL, "DisplayName", NULL, "user", "domain", FALSE }, 0 },
                { "user@domain (Display Name)", "\"Display Name\" <user@domain>", NULL,
-                 { NULL, "Display Name", NULL, "user", "domain", FALSE },
-                 { NULL, "Display Name", NULL, "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, "Display Name", NULL, "user", "domain", FALSE },
+                 { NULL, NULL, "Display Name", NULL, "user", "domain", FALSE }, 0 },
                { "user@domain (Display\"Name)", "\"Display\\\"Name\" <user@domain>", NULL,
-                 { NULL, "Display\"Name", NULL, "user", "domain", FALSE },
-                 { NULL, "Display\"Name", NULL, "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, "Display\"Name", NULL, "user", "domain", FALSE },
+                 { NULL, NULL, "Display\"Name", NULL, "user", "domain", FALSE }, 0 },
                { "user (Display Name)", "\"Display Name\" <user>", "\"Display Name\" <user@MISSING_DOMAIN>",
-                 { NULL, "Display Name", NULL, "user", "", TRUE },
-                 { NULL, "Display Name", NULL, "user", "MISSING_DOMAIN", TRUE }, 0 },
+                 { NULL, NULL, "Display Name", NULL, "user", "", TRUE },
+                 { NULL, NULL, "Display Name", NULL, "user", "MISSING_DOMAIN", TRUE }, 0 },
                { "@domain (Display Name)", "\"Display Name\" <\"\"@domain>", "\"Display Name\" <MISSING_MAILBOX@domain>",
-                 { NULL, "Display Name", NULL, "", "domain", TRUE },
-                 { NULL, "Display Name", NULL, "MISSING_MAILBOX", "domain", TRUE }, 0 },
+                 { NULL, NULL, "Display Name", NULL, "", "domain", TRUE },
+                 { NULL, NULL, "Display Name", NULL, "MISSING_MAILBOX", "domain", TRUE }, 0 },
                { "user@domain ()", "<user@domain>", NULL,
-                 { NULL, NULL, NULL, "user", "domain", FALSE },
-                 { NULL, NULL, NULL, "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, NULL, "user", "domain", FALSE },
+                 { NULL, NULL, NULL, NULL, "user", "domain", FALSE }, 0 },
 
                /* Display Name <user@domain> -> "Display Name" <user@domain> */
                { "DisplayName <user@domain>", NULL, NULL,
-                 { NULL, "DisplayName", NULL, "user", "domain", FALSE },
-                 { NULL, "DisplayName", NULL, "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, "DisplayName", NULL, "user", "domain", FALSE },
+                 { NULL, NULL, "DisplayName", NULL, "user", "domain", FALSE }, 0 },
                { "Display Name <user@domain>", "\"Display Name\" <user@domain>", NULL,
-                 { NULL, "Display Name", NULL, "user", "domain", FALSE },
-                 { NULL, "Display Name", NULL, "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, "Display Name", NULL, "user", "domain", FALSE },
+                 { NULL, NULL, "Display Name", NULL, "user", "domain", FALSE }, 0 },
                { "\"Display Name\" <user@domain>", NULL, NULL,
-                 { NULL, "Display Name", NULL, "user", "domain", FALSE },
-                 { NULL, "Display Name", NULL, "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, "Display Name", NULL, "user", "domain", FALSE },
+                 { NULL, NULL, "Display Name", NULL, "user", "domain", FALSE }, 0 },
                { "\"Display\\\"Name\" <user@domain>", NULL, NULL,
-                 { NULL, "Display\"Name", NULL, "user", "domain", FALSE },
-                 { NULL, "Display\"Name", NULL, "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, "Display\"Name", NULL, "user", "domain", FALSE },
+                 { NULL, NULL, "Display\"Name", NULL, "user", "domain", FALSE }, 0 },
                { "Display Name <user>", "\"Display Name\" <user>", "\"Display Name\" <user@MISSING_DOMAIN>",
-                 { NULL, "Display Name", NULL, "user", "", TRUE },
-                 { NULL, "Display Name", NULL, "user", "MISSING_DOMAIN", TRUE }, 0 },
+                 { NULL, NULL, "Display Name", NULL, "user", "", TRUE },
+                 { NULL, NULL, "Display Name", NULL, "user", "MISSING_DOMAIN", TRUE }, 0 },
                { "\"\" <user@domain>", "<user@domain>", NULL,
-                 { NULL, NULL, NULL, "user", "domain", FALSE },
-                 { NULL, NULL, NULL, "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, NULL, "user", "domain", FALSE },
+                 { NULL, NULL, NULL, NULL, "user", "domain", FALSE }, 0 },
 
                /* <@route:user@domain> -> <@route:user@domain> */
                { "<@route:user@domain>", NULL, NULL,
-                 { NULL, NULL, "@route", "user", "domain", FALSE },
-                 { NULL, NULL, "@route", "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, "@route", "user", "domain", FALSE },
+                 { NULL, NULL, NULL, "@route", "user", "domain", FALSE }, 0 },
                { "<@route,@route2:user@domain>", NULL, NULL,
-                 { NULL, NULL, "@route,@route2", "user", "domain", FALSE },
-                 { NULL, NULL, "@route,@route2", "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, "@route,@route2", "user", "domain", FALSE },
+                 { NULL, NULL, NULL, "@route,@route2", "user", "domain", FALSE }, 0 },
                { "<@route@route2:user@domain>", "<@route,@route2:user@domain>", NULL,
-                 { NULL, NULL, "@route,@route2", "user", "domain", FALSE },
-                 { NULL, NULL, "@route,@route2", "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, "@route,@route2", "user", "domain", FALSE },
+                 { NULL, NULL, NULL, "@route,@route2", "user", "domain", FALSE }, 0 },
                { "<@route@route2:user>", "<@route,@route2:user>", "<@route,@route2:user@MISSING_DOMAIN>",
-                 { NULL, NULL, "@route,@route2", "user", "", TRUE },
-                 { NULL, NULL, "@route,@route2", "user", "MISSING_DOMAIN", TRUE }, 0 },
+                 { NULL, NULL, NULL, "@route,@route2", "user", "", TRUE },
+                 { NULL, NULL, NULL, "@route,@route2", "user", "MISSING_DOMAIN", TRUE }, 0 },
                { "<@route@route2:\"\"@domain>", "<@route,@route2:\"\"@domain>", NULL,
-                 { NULL, NULL, "@route,@route2", "", "domain", FALSE },
-                 { NULL, NULL, "@route,@route2", "", "domain", FALSE }, 0 },
+                 { NULL, NULL, NULL, "@route,@route2", "", "domain", FALSE },
+                 { NULL, NULL, NULL, "@route,@route2", "", "domain", FALSE }, 0 },
 
                /* Display Name <@route:user@domain> ->
                   "Display Name" <@route:user@domain> */
                { "Display Name <@route:user@domain>", "\"Display Name\" <@route:user@domain>", NULL,
-                 { NULL, "Display Name", "@route", "user", "domain", FALSE },
-                 { NULL, "Display Name", "@route", "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, "Display Name", "@route", "user", "domain", FALSE },
+                 { NULL, NULL, "Display Name", "@route", "user", "domain", FALSE }, 0 },
                { "Display Name <@route,@route2:user@domain>", "\"Display Name\" <@route,@route2:user@domain>", NULL,
-                 { NULL, "Display Name", "@route,@route2", "user", "domain", FALSE },
-                 { NULL, "Display Name", "@route,@route2", "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, "Display Name", "@route,@route2", "user", "domain", FALSE },
+                 { NULL, NULL, "Display Name", "@route,@route2", "user", "domain", FALSE }, 0 },
                { "Display Name <@route@route2:user@domain>", "\"Display Name\" <@route,@route2:user@domain>", NULL,
-                 { NULL, "Display Name", "@route,@route2", "user", "domain", FALSE },
-                 { NULL, "Display Name", "@route,@route2", "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, "Display Name", "@route,@route2", "user", "domain", FALSE },
+                 { NULL, NULL, "Display Name", "@route,@route2", "user", "domain", FALSE }, 0 },
                { "Display Name <@route@route2:user>", "\"Display Name\" <@route,@route2:user>", "\"Display Name\" <@route,@route2:user@MISSING_DOMAIN>",
-                 { NULL, "Display Name", "@route,@route2", "user", "", TRUE },
-                 { NULL, "Display Name", "@route,@route2", "user", "MISSING_DOMAIN", TRUE }, 0 },
+                 { NULL, NULL, "Display Name", "@route,@route2", "user", "", TRUE },
+                 { NULL, NULL, "Display Name", "@route,@route2", "user", "MISSING_DOMAIN", TRUE }, 0 },
                { "Display Name <@route@route2:\"\"@domain>", "\"Display Name\" <@route,@route2:\"\"@domain>", NULL,
-                 { NULL, "Display Name", "@route,@route2", "", "domain", FALSE },
-                 { NULL, "Display Name", "@route,@route2", "", "domain", FALSE }, 0 },
+                 { NULL, NULL, "Display Name", "@route,@route2", "", "domain", FALSE },
+                 { NULL, NULL, "Display Name", "@route,@route2", "", "domain", FALSE }, 0 },
 
                /* other tests: */
                { "\"foo: <a@b>;,\" <user@domain>", NULL, NULL,
-                 { NULL, "foo: <a@b>;,", NULL, "user", "domain", FALSE },
-                 { NULL, "foo: <a@b>;,", NULL, "user", "domain", FALSE }, 0 },
+                 { NULL, NULL, "foo: <a@b>;,", NULL, "user", "domain", FALSE },
+                 { NULL, NULL, "foo: <a@b>;,", NULL, "user", "domain", FALSE }, 0 },
                { "<>", "", "<MISSING_MAILBOX@MISSING_DOMAIN>",
-                 { NULL, NULL, NULL, "", "", TRUE },
-                 { NULL, NULL, NULL, "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE }, 0 },
+                 { NULL, NULL, NULL, NULL, "", "", TRUE },
+                 { NULL, NULL, NULL, NULL, "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE }, 0 },
                { "<@>", "", "<INVALID_ROUTE:MISSING_MAILBOX@MISSING_DOMAIN>",
-                 { NULL, NULL, NULL, "", "", TRUE },
-                 { NULL, NULL, "INVALID_ROUTE", "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE }, 0 },
+                 { NULL, NULL, NULL, NULL, "", "", TRUE },
+                 { NULL, NULL, NULL, "INVALID_ROUTE", "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE }, 0 },
 
                /* Test against a out-of-bounds read bug - keep these two tests
                   together in this same order: */
                { "aaaa@", "<aaaa>", "<aaaa@MISSING_DOMAIN>",
-                 { NULL, NULL, NULL, "aaaa", "", TRUE },
-                 { NULL, NULL, NULL, "aaaa", "MISSING_DOMAIN", TRUE }, 0 },
+                 { NULL, NULL, NULL, NULL, "aaaa", "", TRUE },
+                 { NULL, NULL, NULL, NULL, "aaaa", "MISSING_DOMAIN", TRUE }, 0 },
                { "a(aa", "", "<MISSING_MAILBOX@MISSING_DOMAIN>",
-                 { NULL, NULL, NULL, "", "", TRUE },
-                 { NULL, NULL, NULL, "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE },
+                 { NULL, NULL, NULL, NULL, "", "", TRUE },
+                 { NULL, NULL, NULL, NULL, "MISSING_MAILBOX", "MISSING_DOMAIN", TRUE },
                  TEST_MESSAGE_ADDRESS_FLAG_SKIP_LIST },
        };
        static struct message_address group_prefix = {
-               NULL, NULL, NULL, "group", NULL, FALSE
+               NULL, NULL, NULL, NULL, "group", NULL, FALSE
        };
        static struct message_address group_suffix = {
-               NULL, NULL, NULL, NULL, NULL, FALSE
+               NULL, NULL, NULL, NULL, NULL, NULL, FALSE
        };
        const struct message_address *addr;
        string_t *str, *group;
@@ -327,7 +327,7 @@ static void test_message_address_nuls(void)
        const unsigned char input[] =
                "\"user\0nuls\\\0-esc\"@[domain\0nuls\\\0-esc] (comment\0nuls\\\0-esc)";
        const struct message_address output = {
-               NULL, "comment\xEF\xBF\xBDnuls\\\xEF\xBF\xBD-esc", NULL,
+               NULL, NULL, "comment\xEF\xBF\xBDnuls\\\xEF\xBF\xBD-esc", NULL,
                "user\xEF\xBF\xBDnuls\\\xEF\xBF\xBD-esc",
                "[domain\xEF\xBF\xBDnuls\\\xEF\xBF\xBD-esc]", FALSE
        };
@@ -345,7 +345,7 @@ static void test_message_address_nuls_display_name(void)
        const unsigned char input[] =
                "\"displayname\0nuls\\\0-esc\" <\"user\0nuls\\\0-esc\"@[domain\0nuls\\\0-esc]>";
        const struct message_address output = {
-               NULL, "displayname\xEF\xBF\xBDnuls\\\xEF\xBF\xBD-esc", NULL,
+               NULL, NULL, "displayname\xEF\xBF\xBDnuls\\\xEF\xBF\xBD-esc", NULL,
                "user\xEF\xBF\xBDnuls\\\xEF\xBF\xBD-esc",
                "[domain\xEF\xBF\xBDnuls\\\xEF\xBF\xBD-esc]", FALSE
        };
@@ -369,7 +369,7 @@ static void test_message_address_non_strict_dots(void)
        };
        const struct message_address *addr;
        struct message_address output = {
-               NULL, NULL, NULL, "local-part",
+               NULL, NULL, NULL, NULL, "local-part",
                "example.com", FALSE
        };
 
@@ -421,29 +421,29 @@ static void test_message_address_path(void)
                struct message_address addr;
        } tests[] = {
                { "<>", NULL,
-                 { NULL, NULL, NULL, NULL, NULL, FALSE } },
+                 { NULL, NULL, NULL, NULL, NULL, NULL, FALSE } },
                { " < > ", "<>",
-                 { NULL, NULL, NULL, NULL, NULL, FALSE } },
+                 { NULL, NULL, NULL, NULL, NULL, NULL, FALSE } },
                { "<user@domain>", NULL,
-                 { NULL, NULL, NULL, "user", "domain", FALSE } },
+                 { NULL, NULL, NULL, NULL, "user", "domain", FALSE } },
                { "  <user@domain>  ", "<user@domain>",
-                 { NULL, NULL, NULL, "user", "domain", FALSE } },
+                 { NULL, NULL, NULL, NULL, "user", "domain", FALSE } },
                { "user@domain", "<user@domain>",
-                 { NULL, NULL, NULL, "user", "domain", FALSE } },
+                 { NULL, NULL, NULL, NULL, "user", "domain", FALSE } },
                { "  user@domain  ", "<user@domain>",
-                 { NULL, NULL, NULL, "user", "domain", FALSE } },
+                 { NULL, NULL, NULL, NULL, "user", "domain", FALSE } },
                { "<\"user\"@domain>", "<user@domain>",
-                 { NULL, NULL, NULL, "user", "domain", FALSE } },
+                 { NULL, NULL, NULL, NULL, "user", "domain", FALSE } },
                { "<\"user name\"@domain>", NULL,
-                 { NULL, NULL, NULL, "user name", "domain", FALSE } },
+                 { NULL, NULL, NULL, NULL, "user name", "domain", FALSE } },
                { "<\"user@na\\\\me\"@domain>", NULL,
-                 { NULL, NULL, NULL, "user@na\\me", "domain", FALSE } },
+                 { NULL, NULL, NULL, NULL, "user@na\\me", "domain", FALSE } },
                { "<\"user\\\"name\"@domain>", NULL,
-                 { NULL, NULL, NULL, "user\"name", "domain", FALSE } },
+                 { NULL, NULL, NULL, NULL, "user\"name", "domain", FALSE } },
                { "<\"\"@domain>", NULL,
-                 { NULL, NULL, NULL, "", "domain", FALSE } },
+                 { NULL, NULL, NULL, NULL, "", "domain", FALSE } },
                { "<@source", "<>",
-                 { NULL, NULL, NULL, NULL, NULL, TRUE } },
+                 { NULL, NULL, NULL, NULL, NULL, NULL, TRUE } },
        };
        const struct message_address *addr;
        string_t *str;