From 375dfef0da4b4a9a99c5df1902387e85a6a8fc45 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 13 Mar 2015 12:59:19 +0000 Subject: [PATCH] Add workaround for certain types of urls. --- src/libserver/url.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/libserver/url.c b/src/libserver/url.c index 977da2fbb..78b16af92 100644 --- a/src/libserver/url.c +++ b/src/libserver/url.c @@ -1247,6 +1247,9 @@ rspamd_web_parse (struct http_parser_url *u, const gchar *str, gsize len, } else if (!is_urlsafe (t)) { if (strict) { + if (g_ascii_isspace (t)) { + goto set; + } goto out; } else { @@ -1265,6 +1268,9 @@ rspamd_web_parse (struct http_parser_url *u, const gchar *str, gsize len, } else if (!is_urlsafe (t)) { if (strict) { + if (g_ascii_isspace (t)) { + goto set; + } goto out; } else { @@ -1276,6 +1282,9 @@ rspamd_web_parse (struct http_parser_url *u, const gchar *str, gsize len, case parse_part: if (!is_urlsafe (t)) { if (strict) { + if (g_ascii_isspace (t)) { + goto set; + } goto out; } else { @@ -1352,6 +1361,7 @@ rspamd_url_parse (struct rspamd_url *uri, gchar *uristring, gsize len, { struct http_parser_url u; gchar *p, *comp; + const gchar *end; guint i, complen, ret; const struct { @@ -1403,20 +1413,26 @@ rspamd_url_parse (struct rspamd_url *uri, gchar *uristring, gsize len, if (len > sizeof ("mailto:") - 1) { /* For mailto: urls we also need to add slashes to make it a valid URL */ if (g_ascii_strncasecmp (p, "mailto:", sizeof ("mailto:") - 1) == 0) { - ret = rspamd_mailto_parse (&u, uristring, len, NULL); + ret = rspamd_mailto_parse (&u, uristring, len, &end); } else { - ret = rspamd_web_parse (&u, uristring, len, NULL, TRUE); + ret = rspamd_web_parse (&u, uristring, len, &end, TRUE); } } else { - ret = rspamd_web_parse (&u, uristring, len, NULL, TRUE); + ret = rspamd_web_parse (&u, uristring, len, &end, TRUE); } if (ret != 0) { return URI_ERRNO_BAD_FORMAT; } + if (end > uristring && (guint)(end - uristring) != len) { + /* We have extra data at the end of uri, so we are ignoring it for now */ + p = rspamd_mempool_alloc (pool, end - uristring + 1); + rspamd_strlcpy (p, uristring, end - uristring + 1); + } + for (i = 0; i < UF_MAX; i ++) { if (u.field_set & (1 << i)) { comp = p + u.field_data[i].off; -- 2.39.5