From: Vsevolod Stakhov Date: Wed, 1 Jul 2015 16:18:32 +0000 (+0100) Subject: Fix complicated case of percent encoding. X-Git-Tag: 1.0.0~462 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a40bad22fe2d8ad447bb5c75d648b1bfeb5f129f;p=thirdparty%2Frspamd.git Fix complicated case of percent encoding. --- diff --git a/src/libserver/url.c b/src/libserver/url.c index 655f84a60c..a4a92b14c1 100644 --- a/src/libserver/url.c +++ b/src/libserver/url.c @@ -737,7 +737,7 @@ rspamd_web_parse (struct http_parser_url *u, const gchar *str, gsize len, p ++; } else { - if (*p != '.' && *p != '-' && *p != '_') { + if (*p != '.' && *p != '-' && *p != '_' && *p != '%') { uc = g_utf8_get_char_validated (p, last - p); if (uc == (gunichar)-1) { @@ -1127,7 +1127,25 @@ rspamd_url_parse (struct rspamd_url *uri, gchar *uristring, gsize len, /* Now decode url symbols */ uri->string = p; uri->urllen = len; - rspamd_unescape_uri (uri->string, uri->string, len); + + if (uri->userlen == 0) { + rspamd_unescape_uri (uri->string, uri->string, len); + } + else { + rspamd_unescape_uri (uri->string, uri->string, uri->protocollen); + rspamd_unescape_uri (uri->host, uri->host, uri->hostlen); + + if (uri->datalen) { + rspamd_unescape_uri (uri->data, uri->data, uri->datalen); + } + if (uri->querylen) { + rspamd_unescape_uri (uri->query, uri->query, uri->querylen); + } + if (uri->fragmentlen) { + rspamd_unescape_uri (uri->fragment, uri->fragment, uri->fragmentlen); + } + } + rspamd_str_lc (uri->string, uri->protocollen); rspamd_str_lc_utf8 (uri->host, uri->hostlen);