]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-mail: message-address: Require paths with an invalid source route to have at...
authorStephan Bosch <stephan.bosch@dovecot.fi>
Thu, 12 Apr 2018 19:59:40 +0000 (21:59 +0200)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Wed, 25 Apr 2018 08:12:06 +0000 (11:12 +0300)
Otherwise, the parser would allow a bare domain.

src/lib-mail/message-address.c
src/lib-mail/test-message-address.c

index 8a75ed63caccac2ab243e5ecbd429d853fc570a1..3a6206786fa563894a55ead7705e65051bfad7cd 100644 (file)
@@ -139,7 +139,8 @@ static int parse_domain_list(struct message_address_parser_context *ctx)
        return 1;
 }
 
-static int parse_angle_addr(struct message_address_parser_context *ctx)
+static int parse_angle_addr(struct message_address_parser_context *ctx,
+                           bool parsing_path)
 {
        /* "<" [ "@" route ":" ] local-part "@" domain ">" */
        i_assert(*ctx->parser.data == '<');
@@ -149,14 +150,16 @@ static int parse_angle_addr(struct message_address_parser_context *ctx)
                return -1;
 
        if (*ctx->parser.data == '@') {
-               if (parse_domain_list(ctx) <= 0 || *ctx->parser.data != ':') {
+               if (parse_domain_list(ctx) > 0 && *ctx->parser.data == ':') {
+                       ctx->parser.data++;
+               } else if (parsing_path && *ctx->parser.data != ':') {
+                       return -1;
+               } else {
                        if (ctx->fill_missing)
                                ctx->addr.route = "INVALID_ROUTE";
                        if (ctx->parser.data >= ctx->parser.end)
                                return -1;
                        /* try to continue anyway */
-               } else {
-                       ctx->parser.data++;
                }
                if (rfc822_skip_lwsp(&ctx->parser) <= 0)
                        return -1;
@@ -196,7 +199,7 @@ static int parse_name_addr(struct message_address_parser_context *ctx)
                /* Cope with "<address>" without display name */
                ctx->addr.name = NULL;
        }
-       if (parse_angle_addr(ctx) < 0) {
+       if (parse_angle_addr(ctx, FALSE) < 0) {
                /* broken */
                if (ctx->fill_missing)
                        ctx->addr.domain = "SYNTAX_ERROR";
@@ -392,7 +395,7 @@ static int parse_path(struct message_address_parser_context *ctx)
                return -1;
        if (*ctx->parser.data != '<')
                return -1;
-       if ((ret=parse_angle_addr(ctx)) < 0 ||
+       if ((ret=parse_angle_addr(ctx, TRUE)) < 0 ||
            (ctx->addr.mailbox != NULL && ctx->addr.domain == NULL)) {
                ctx->addr.invalid_syntax = TRUE;
                ret = -1;
index d50a08d3fbc5a77b7149533027664fab3ded8991..0d8249b4f9c7df57092d7e4933df87529d520354 100644 (file)
@@ -413,6 +413,7 @@ static void test_message_address_path_invalid(void)
                "  user@domain>  ",
                "<user>",
                "<@route@route2:user>",
+               "<@domain>",
        };
        const struct message_address *addr;
        unsigned int i;