]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Try to avoid a corner case for `@` pattern
authorVsevolod Stakhov <vsevolod@rspamd.com>
Thu, 4 Aug 2022 20:50:12 +0000 (21:50 +0100)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Thu, 4 Aug 2022 20:50:12 +0000 (21:50 +0100)
Issue: #4217

src/libserver/url.c

index 22bd60a433b4824aad822d7b030f538d6c65f145..62f21e367024cee0f7e8bae425786e15decd3bf0 100644 (file)
@@ -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)) {