From 7c1f135f887cb0cab4e17cc9b97c1d83e0139ca6 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sat, 9 Jul 2005 09:32:45 +0000 Subject: [PATCH] When we encounter an URL with multiple @'s, the first one should be treated as the username separator and the subsequent ones automatically escaped. Therefore, `http://a@b@c.cz/' is normalized as `http://a@b%40c.cz/'. It's probably an invalid URL (have to check all the possible loopholes in the spec yet :) ), but it occurs in the wild anyway, so let's try to treat them with grace. --- lib/url.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/url.c b/lib/url.c index 453538c2..d5cbcea2 100644 --- a/lib/url.c +++ b/lib/url.c @@ -224,18 +224,28 @@ url_split(byte *s, struct url *u, byte *d) { if (s[1] == '/') /* Host spec */ { - byte *q, *w, *e; + byte *q, *e; + byte *at = NULL; char *ep; s += 2; q = d; while (*s && *s != '/' && *s != '?') /* Copy user:passwd@host:port */ - *d++ = *s++; + { + if (*s != '@') + *d++ = *s; + else if (!at) + { + *d++ = 0; + at = d; + } + else /* This shouldn't happen with sane URL's, but we need to be sure */ + *d++ = NCC_AT; + s++; + } *d++ = 0; - w = strchr(q, '@'); - if (w) /* user:passwd present */ + if (at) /* user:passwd present */ { - *w++ = 0; u->user = q; if (e = strchr(q, ':')) { @@ -244,8 +254,8 @@ url_split(byte *s, struct url *u, byte *d) } } else - w = q; - e = strchr(w, ':'); + at = q; + e = strchr(at, ':'); if (e) /* host:port present */ { uns p; @@ -256,7 +266,7 @@ url_split(byte *s, struct url *u, byte *d) else if (p) /* Port 0 (e.g. in :/) is treated as default port */ u->port = p; } - u->host = w; + u->host = at; } } -- 2.39.5