itss: Canonicalize relative paths before resolving object.

This commit is contained in:
Jacek Caban 2012-09-21 12:28:18 +02:00 committed by Alexandre Julliard
parent e75683b858
commit 1a56a73c86
2 changed files with 54 additions and 0 deletions

View File

@ -134,6 +134,55 @@ static LPCWSTR skip_schema(LPCWSTR url)
return NULL;
}
/* Adopted from urlmon */
static void remove_dot_segments(WCHAR *path) {
const WCHAR *in = path;
WCHAR *out = path;
while(1) {
/* Move the first path segment in the input buffer to the end of
* the output buffer, and any subsequent characters up to, including
* the next "/" character (if any) or the end of the input buffer.
*/
while(*in != '/') {
if(!(*out++ = *in++))
return;
}
*out++ = *in++;
while(*in) {
if(*in != '.')
break;
/* Handle ending "/." */
if(!in[1]) {
++in;
break;
}
/* Handle "/./" */
if(in[1] == '/') {
in += 2;
continue;
}
/* If we don't have "/../" or ending "/.." */
if(in[1] != '.' || (in[2] && in[2] != '/'))
break;
in += *in ? 3 : 2;
/* Find the slash preceding out pointer and move out pointer to it */
if(out > path+1 && *--out == '/')
--out;
while(out > path && *(--out) != '/');
if(*out == '/')
++out;
}
}
}
static HRESULT report_result(IInternetProtocolSink *sink, HRESULT hres)
{
IInternetProtocolSink_ReportResult(sink, hres, 0, NULL);
@ -215,6 +264,8 @@ static HRESULT WINAPI ITSProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
*p = '/';
}
remove_dot_segments(object_name);
TRACE("Resolving %s\n", debugstr_w(object_name));
memset(&chm_object, 0, sizeof(chm_object));

View File

@ -87,6 +87,8 @@ static const WCHAR blank_url7[] = {'m','k',':','@','M','S','I','T','S','t','o','
't','e','s','t','.','c','h','m',':',':','\\','b','l','a','n','k','.','h','t','m','l',0};
static const WCHAR blank_url8[] = {'m','k',':','@','M','S','I','T','S','t','o','r','e',':',
't','e','s','t','.','c','h','m',':',':','/','b','l','a','n','k','.','h','t','m','l','/',0};
static const WCHAR blank_url9[] = {'i','t','s',':',
't','e','s','t','.','c','h','m',':',':','/','d','i','r','/','.','.','/','b','l','a','n','k','.','h','t','m','l',0};
static enum {
ITS_PROTOCOL,
@ -612,6 +614,7 @@ static void test_its_protocol(void)
test_protocol_url(factory, blank_url5, TRUE);
test_protocol_url(factory, blank_url6, TRUE);
test_protocol_url(factory, blank_url8, TRUE);
test_protocol_url(factory, blank_url9, TRUE);
bindf = BINDF_FROMURLMON | BINDF_NEEDFILE;
test_protocol_url(factory, blank_url1, TRUE);
}