From: Vsevolod Stakhov Date: Wed, 21 Jul 2021 14:42:57 +0000 (+0100) Subject: [Minor] Fix parsing of some misformed email addresses X-Git-Tag: 3.0~119 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=276d5a92efb6f4c630a53398458b7286da048757;p=thirdparty%2Frspamd.git [Minor] Fix parsing of some misformed email addresses --- diff --git a/src/libmime/email_addr.c b/src/libmime/email_addr.c index 6895c1b11f..38a4732c5d 100644 --- a/src/libmime/email_addr.c +++ b/src/libmime/email_addr.c @@ -248,7 +248,7 @@ rspamd_email_address_from_mime (rspamd_mempool_t *pool, const gchar *hdr, gint max_elements) { GPtrArray *res = src; - gboolean seen_at = FALSE; + gboolean seen_at = FALSE, seen_obrace = FALSE; const gchar *p = hdr, *end = hdr + len, *c = hdr, *t; GString *ns, *cpy; @@ -434,6 +434,12 @@ rspamd_email_address_from_mime (rspamd_mempool_t *pool, const gchar *hdr, state = skip_spaces; next_state = parse_name; } + else if (*p == '@' && seen_obrace) { + seen_at = TRUE; + } + else if (*p == '<') { + seen_obrace = TRUE; + } p ++; break; case parse_addr: @@ -518,6 +524,17 @@ rspamd_email_address_from_mime (rspamd_mempool_t *pool, const gchar *hdr, break; case parse_quoted: /* Unfinished quoted string or a comment */ + /* If we have seen obrace + at, then we still can try to resolve address */ + if (seen_at && seen_obrace) { + p = rspamd_memrchr (cpy->str, '<', cpy->len); + g_assert (p != NULL); + if (rspamd_email_address_check_and_add (p, end - p, + res, pool, ns, max_elements) == 0) { + if (res->len == 0) { + rspamd_email_address_add (pool, res, NULL, ns); + } + } + } break; default: /* Do nothing */ diff --git a/test/lua/unit/smtp_addr.lua b/test/lua/unit/smtp_addr.lua index 062c509d56..cfce20fcc0 100644 --- a/test/lua/unit/smtp_addr.lua +++ b/test/lua/unit/smtp_addr.lua @@ -4,7 +4,7 @@ context("SMTP address check functions", function() local logger = require("rspamd_logger") local ffi = require("ffi") local util = require("rspamd_util") - require "fun" () + local fun = require "fun" ffi.cdef[[ struct rspamd_email_address { const char *raw; @@ -47,13 +47,13 @@ context("SMTP address check functions", function() } - each(function(case) + fun.each(function(case) test("Parse valid smtp addr: " .. case[1], function() local st = ffi.C.rspamd_email_address_from_smtp(case[1], #case[1]) assert_not_nil(st, "should be able to parse " .. case[1]) - each(function(k, ex) + fun.each(function(k, ex) if k == 'user' then local str = ffi.string(st.user, st.user_len) assert_equal(str, ex) @@ -81,7 +81,7 @@ context("SMTP address check functions", function() '<>', } - each(function(case) + fun.each(function(case) test("Parse invalid smtp addr: " .. case, function() local st = ffi.C.rspamd_email_address_from_smtp(case, #case)