]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-address - Don't allow missing '<' and '>' with only SMTP_ADDRESS_PARSE...
authorStephan Bosch <stephan.bosch@open-xchange.com>
Wed, 20 Nov 2019 23:35:51 +0000 (00:35 +0100)
committerStephan Bosch <stephan.bosch@open-xchange.com>
Thu, 21 Nov 2019 14:37:19 +0000 (15:37 +0100)
src/lib-smtp/smtp-address.c
src/lib-smtp/test-smtp-address.c

index 99c369e7594dfca19fbf4cf1db4f38e051d82d91..f89a2b0cda412ee5f87a4d24f91eacb7fb94fb63 100644 (file)
@@ -358,6 +358,11 @@ smtp_address_parse_path_broken(struct smtp_address_parser *aparser,
        if (aparser->totally_broken ||
            HAS_NO_BITS(flags, SMTP_ADDRESS_PARSE_FLAG_IGNORE_BROKEN))
                return -1;
+       if (*begin != '<' &&
+           HAS_NO_BITS(flags, SMTP_ADDRESS_PARSE_FLAG_BRACKETS_OPTIONAL)) {
+               /* brackets missing; totally broken */
+               return -1;
+       }
        i_assert(aparser->parse);
        if (aparser->parsed_any) {
                if (endp_r != NULL)
index b13622ba66a0b71779eab217899099cf5c909ac5..f16ac4c4536a6aa2a458496f100ed1dc1179c678 100644 (file)
@@ -295,7 +295,8 @@ valid_path_parse_tests[] = {
        },
        {
                .input = "u\"ser",
-               .flags = SMTP_ADDRESS_PARSE_FLAG_ALLOW_LOCALPART |
+               .flags = SMTP_ADDRESS_PARSE_FLAG_BRACKETS_OPTIONAL |
+                        SMTP_ADDRESS_PARSE_FLAG_ALLOW_LOCALPART |
                         SMTP_ADDRESS_PARSE_FLAG_PRESERVE_RAW |
                         SMTP_ADDRESS_PARSE_FLAG_IGNORE_BROKEN,
                .address = { .localpart = NULL, .domain = NULL,
@@ -304,7 +305,8 @@ valid_path_parse_tests[] = {
        },
        {
                .input = "user\"@domain.tld",
-               .flags = SMTP_ADDRESS_PARSE_FLAG_PRESERVE_RAW |
+               .flags = SMTP_ADDRESS_PARSE_FLAG_BRACKETS_OPTIONAL |
+                        SMTP_ADDRESS_PARSE_FLAG_PRESERVE_RAW |
                         SMTP_ADDRESS_PARSE_FLAG_IGNORE_BROKEN,
                .address = { .localpart = NULL, .domain = NULL,
                             .raw = "user\"@domain.tld" },
@@ -329,7 +331,8 @@ valid_path_parse_tests[] = {
        },
        {
                .input = "bla$die%bla@die&bla",
-               .flags = SMTP_ADDRESS_PARSE_FLAG_PRESERVE_RAW |
+               .flags = SMTP_ADDRESS_PARSE_FLAG_BRACKETS_OPTIONAL |
+                        SMTP_ADDRESS_PARSE_FLAG_PRESERVE_RAW |
                         SMTP_ADDRESS_PARSE_FLAG_IGNORE_BROKEN,
                .address = { .localpart = NULL, .domain = NULL,
                             .raw = "bla$die%bla@die&bla" },
@@ -337,7 +340,8 @@ valid_path_parse_tests[] = {
        },
        {
                .input = "/@)$@)BLAARGH!@#$$",
-               .flags = SMTP_ADDRESS_PARSE_FLAG_PRESERVE_RAW |
+               .flags = SMTP_ADDRESS_PARSE_FLAG_BRACKETS_OPTIONAL |
+                        SMTP_ADDRESS_PARSE_FLAG_PRESERVE_RAW |
                         SMTP_ADDRESS_PARSE_FLAG_IGNORE_BROKEN,
                .address = { .localpart = NULL, .domain = NULL,
                             .raw = "/@)$@)BLAARGH!@#$$" },
@@ -373,7 +377,8 @@ valid_path_parse_tests[] = {
        },
        {
                .input = "f\xc3\xb6\xc3\xa4@\xc3\xb6\xc3\xa4",
-               .flags = SMTP_ADDRESS_PARSE_FLAG_PRESERVE_RAW |
+               .flags = SMTP_ADDRESS_PARSE_FLAG_BRACKETS_OPTIONAL |
+                        SMTP_ADDRESS_PARSE_FLAG_PRESERVE_RAW |
                         SMTP_ADDRESS_PARSE_FLAG_IGNORE_BROKEN |
                         SMTP_ADDRESS_PARSE_FLAG_ALLOW_BAD_LOCALPART |
                         SMTP_ADDRESS_PARSE_FLAG_BRACKETS_OPTIONAL,
@@ -897,6 +902,10 @@ invalid_path_parse_tests[] = {
                .input = "@otherdomain.tld,@yetanotherdomain.tld:user@domain.tld",
                .flags = SMTP_ADDRESS_PARSE_FLAG_BRACKETS_OPTIONAL
        },
+       {
+               .input = "user@domain.tld",
+               .flags = SMTP_ADDRESS_PARSE_FLAG_IGNORE_BROKEN,
+       },
        {
                .input = "<>",
        },
@@ -1014,6 +1023,10 @@ invalid_path_parse_tests[] = {
        {
                .input = "<@###domain.tld,@yetanotherdomain.tld.user@domain.tld>",
        },
+       {
+               .input = "f\xc3\xb6\xc3\xa4@\xc3\xb6\xc3\xa4",
+               .flags = SMTP_ADDRESS_PARSE_FLAG_IGNORE_BROKEN,
+       }
 };
 
 unsigned int invalid_path_parse_test_count =
@@ -1036,7 +1049,8 @@ static void test_smtp_path_parse_invalid(void)
 
                test_begin(t_strdup_printf("smtp path invalid [%d]", i));
                test_out_reason(t_strdup_printf("parse(\"%s\")", test->input),
-                               ret < 0, error);
+                               (ret < 0 && !smtp_address_is_broken(address)),
+                               error);
                test_end();
        } T_END;
 }