]> source.dussan.org Git - rspamd.git/commitdiff
Add workaround for certain types of urls.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 13 Mar 2015 12:59:19 +0000 (12:59 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 13 Mar 2015 12:59:19 +0000 (12:59 +0000)
src/libserver/url.c

index bdb59f699800db676ad4ff4243e4f621e84377ba..53948ba89379052b9dc4cf38206e8376c14f4793 100644 (file)
@@ -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;