diff options
Diffstat (limited to 'websvcs/lib/URL_Addr.cpp')
-rw-r--r-- | websvcs/lib/URL_Addr.cpp | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/websvcs/lib/URL_Addr.cpp b/websvcs/lib/URL_Addr.cpp index 439e4d130c2..19054c3a601 100644 --- a/websvcs/lib/URL_Addr.cpp +++ b/websvcs/lib/URL_Addr.cpp @@ -327,13 +327,15 @@ path_copy (LPCTSTR begin, switch (c) { case '/': - if (*(src + 1) == '.' - && (*src + 2) == '.' - && (*src + 3) == '/') + if (src[1] == '.' && src[2] == '.' && url[3] == '/') { while (target != begin && *(--target) != '/'); src += 3; } + else if (src[1] == '.' && src[2] == '/') + { + src += 2; + } else { *target = c; @@ -396,10 +398,20 @@ ACE_HTTP_Addr::create_relative_address (LPCTSTR url) const // Go back to the last / to remove the basename. while (target != buf && *(--target) != '/'); // Go back if we begin with '../' - while (url[0] == '.' && url[1] == '.' && url[2] == '/') + while ((url[0] == '.' && url[1] == '.' && url[2] == '/') + || (url[0] == '.' && url[1] == '/')) { - while (target != buf && *(--target) != '/'); - url += 3; + if (url[1] == '.') + { + // A ../ go back + while (target != buf && *(--target) != '/'); + url += 3; + } + else + { + // A ./ remove + url += 2; + } } *target = '/'; ++target; |