Module: wine Branch: master Commit: 6862697acb3ec07ec991b34ed3af96d740563a3d URL: http://source.winehq.org/git/wine.git/?a=commit;h=6862697acb3ec07ec991b34ed3...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Jun 22 19:22:08 2011 +0200
urlmon: Fixed handling empty URIs.
---
dlls/urlmon/tests/uri.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++- dlls/urlmon/uri.c | 44 +++++++++++++++++++------------------- 2 files changed, 74 insertions(+), 23 deletions(-)
diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c index 930622a..bc84825 100644 --- a/dlls/urlmon/tests/uri.c +++ b/dlls/urlmon/tests/uri.c @@ -4139,7 +4139,58 @@ static const uri_properties uri_tests[] = { {URL_SCHEME_MK,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} } - } + }, + { "", Uri_CREATE_ALLOW_RELATIVE, S_OK, FALSE, + { + {"",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_OK,FALSE}, + {"",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { " \t ", Uri_CREATE_ALLOW_RELATIVE, S_OK, FALSE, + { + {"",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_OK,FALSE}, + {"",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + };
typedef struct _invalid_uri { diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c index f12f826..6f2897a 100644 --- a/dlls/urlmon/uri.c +++ b/dlls/urlmon/uri.c @@ -857,35 +857,35 @@ static void compute_elision_location(const ipv6_address *address, const USHORT v * characters inside of the URI string. */ static BSTR pre_process_uri(LPCWSTR uri) { - BSTR ret; + const WCHAR *start, *end, *ptr; + WCHAR *ptr2; DWORD len; - const WCHAR *start, *end; - WCHAR *buf, *ptr; - - len = lstrlenW(uri); + BSTR ret;
start = uri; /* Skip leading controls and whitespace. */ - while(iscntrlW(*start) || isspaceW(*start)) ++start; + while(*start && (iscntrlW(*start) || isspaceW(*start))) ++start;
- end = uri+len-1; - if(start == end) - /* URI consisted only of control/whitespace. */ - ret = SysAllocStringLen(NULL, 0); - else { - while(iscntrlW(*end) || isspaceW(*end)) --end; + /* URI consisted only of control/whitespace. */ + if(!*start) + return SysAllocStringLen(NULL, 0);
- buf = heap_alloc(((end+1)-start)*sizeof(WCHAR)); - if(!buf) - return NULL; + end = start + strlenW(start); + while(--end > start && (iscntrlW(*end) || isspaceW(*end)));
- for(ptr = buf; start < end+1; ++start) { - if(!iscntrlW(*start)) - *ptr++ = *start; - } + len = ++end - start; + for(ptr = start; ptr < end; ptr++) { + if(iscntrlW(*ptr)) + len--; + } + + ret = SysAllocStringLen(NULL, len); + if(!ret) + return NULL;
- ret = SysAllocStringLen(buf, ptr-buf); - heap_free(buf); + for(ptr = start, ptr2=ret; ptr < end; ptr++) { + if(!iscntrlW(*ptr)) + *ptr2++ = *ptr; }
return ret; @@ -5096,7 +5096,7 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU if(!ppURI) return E_INVALIDARG;
- if(!pwzURI || !*pwzURI) { + if(!pwzURI) { *ppURI = NULL; return E_INVALIDARG; }