From 5c62b6eebed4e33bbbcd4b01f7aff38196673370 Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Thu, 12 Apr 2018 16:13:08 +0200 Subject: [PATCH] lib-mail: message-address: Make the parser allow paths that omit `<' and `>'. This is a syntax violation, but we allow it to account for a rather wide selection of software that does not follow the standards. --- src/lib-mail/message-address.c | 17 +++++++++++++---- src/lib-mail/test-message-address.c | 11 +++++++++-- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/lib-mail/message-address.c b/src/lib-mail/message-address.c index f7b383468d..a9456f613c 100644 --- a/src/lib-mail/message-address.c +++ b/src/lib-mail/message-address.c @@ -393,10 +393,19 @@ static int parse_path(struct message_address_parser_context *ctx) if (rfc822_skip_lwsp(&ctx->parser) <= 0) return -1; - if (*ctx->parser.data != '<') - return -1; - if ((ret=parse_angle_addr(ctx, TRUE)) < 0 || - (ret=rfc822_skip_lwsp(&ctx->parser)) < 0 || + if (*ctx->parser.data != '<') { + /* Cope with paths that omit < and >. This is a syntax + violation, but we allow it to account for a rather wide + selection of software that does not follow the standards. + */ + if ((ret=parse_local_part(ctx)) > 0 && + *ctx->parser.data == '@') { + ret = parse_domain(ctx); + } + } else { + ret = parse_angle_addr(ctx, TRUE); + } + if (ret < 0 || (ret=rfc822_skip_lwsp(&ctx->parser)) < 0 || ctx->parser.data != ctx->parser.end || (ctx->addr.mailbox != NULL && (ctx->addr.domain == NULL || *ctx->addr.domain == '\0')) || diff --git a/src/lib-mail/test-message-address.c b/src/lib-mail/test-message-address.c index da0b0b23bf..c0adc5dc16 100644 --- a/src/lib-mail/test-message-address.c +++ b/src/lib-mail/test-message-address.c @@ -355,6 +355,10 @@ static void test_message_address_path(void) { NULL, NULL, NULL, "user", "domain", FALSE } }, { " ", "", { NULL, NULL, NULL, "user", "domain", FALSE } }, + { "user@domain", "", + { NULL, NULL, NULL, "user", "domain", FALSE } }, + { " user@domain ", "", + { NULL, NULL, NULL, "user", "domain", FALSE } }, { "<\"user\"@domain>", "", { NULL, NULL, NULL, "user", "domain", FALSE } }, { "<\"user name\"@domain>", NULL, @@ -405,8 +409,6 @@ static void test_message_address_path_invalid(void) " < ", ">", " > ", - "user@domain", - " user@domain ", "", @@ -414,8 +416,13 @@ static void test_message_address_path_invalid(void) "", "<@route@route2:user>", "<@domain>", + "@domain", + " @domain ", "", + "user@", + " user@ ", "bladiebla", + "user@domain@" }; const struct message_address *addr; unsigned int i;