From ca59cf9fcb46675c8f455fa6fb709d2357af6111 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 4 Aug 2022 21:50:12 +0100 Subject: [PATCH] [Fix] Try to avoid a corner case for `@` pattern Issue: #4217 --- src/libserver/url.c | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/libserver/url.c b/src/libserver/url.c index 22bd60a43..62f21e367 100644 --- a/src/libserver/url.c +++ b/src/libserver/url.c @@ -2489,23 +2489,30 @@ rspamd_url_parse (struct rspamd_url *uri, } if (uri->tldlen == 0) { - if (!(parse_flags & RSPAMD_URL_PARSE_HREF)) { - /* Ignore URL's without TLD if it is not a numeric URL */ - if (!rspamd_url_is_ip (uri, pool)) { - return URI_ERRNO_TLD_MISSING; - } - } else { - if (!rspamd_url_is_ip (uri, pool)) { - /* Assume tld equal to host */ - uri->tldshift = uri->hostshift; - uri->tldlen = uri->hostlen; - } - else if (uri->flags & RSPAMD_URL_FLAG_SCHEMALESS) { - /* Ignore urls with both no schema and no tld */ - return URI_ERRNO_TLD_MISSING; + if (uri->protocol != PROTOCOL_MAILTO) { + if (!(parse_flags & RSPAMD_URL_PARSE_HREF)) { + /* Ignore URL's without TLD if it is not a numeric URL */ + if (!rspamd_url_is_ip(uri, pool)) { + return URI_ERRNO_TLD_MISSING; + } } + else { + if (!rspamd_url_is_ip(uri, pool)) { + /* Assume tld equal to host */ + uri->tldshift = uri->hostshift; + uri->tldlen = uri->hostlen; + } + else if (uri->flags & RSPAMD_URL_FLAG_SCHEMALESS) { + /* Ignore urls with both no schema and no tld */ + return URI_ERRNO_TLD_MISSING; + } - uri->flags |= RSPAMD_URL_FLAG_NO_TLD; + uri->flags |= RSPAMD_URL_FLAG_NO_TLD; + } + } + else { + /* Ignore IP like domains for mailto, as it is really never supported */ + return URI_ERRNO_TLD_MISSING; } } @@ -2980,10 +2987,12 @@ url_email_end (struct url_callback_data *cb, return FALSE; } + /* Check the next character after `@` */ if (!g_ascii_isalnum (pos[1]) || !g_ascii_isalnum (*(pos - 1))) { return FALSE; } + c = pos - 1; while (c > cb->begin) { if (!is_mailsafe (*c)) { -- 2.39.5