Module: wine Branch: master Commit: e57b8526b293560b5731f51f2b06c93b247077c9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e57b8526b293560b5731f51f2b... Author: Jacek Caban <jacek(a)codeweavers.com> Date: Sun Oct 18 21:49:18 2009 +0200 shlwapi: Make more strict restriction for URL scheme and fix error handling in ParseURLA. --- dlls/shlwapi/url.c | 43 ++++++++++++++++--------------------------- 1 files changed, 16 insertions(+), 27 deletions(-) diff --git a/dlls/shlwapi/url.c b/dlls/shlwapi/url.c index 66c88a6..1b8803c 100644 --- a/dlls/shlwapi/url.c +++ b/dlls/shlwapi/url.c @@ -145,40 +145,29 @@ static DWORD get_scheme_code(LPCWSTR scheme, DWORD scheme_len) HRESULT WINAPI ParseURLA(LPCSTR x, PARSEDURLA *y) { WCHAR scheme[INTERNET_MAX_SCHEME_LENGTH]; - DWORD cnt, len; + const char *ptr = x; + int len; - y->nScheme = URL_SCHEME_INVALID; - if (y->cbSize != sizeof(*y)) return E_INVALIDARG; - /* FIXME: leading white space generates error of 0x80041001 which - * is undefined - */ - if (*x <= ' ') return 0x80041001; - cnt = 0; - y->cchProtocol = 0; - y->pszProtocol = x; - while (*x) { - if (*x == ':') { - y->cchProtocol = cnt; - cnt = -1; - y->pszSuffix = x+1; - break; - } - x++; - cnt++; - } + TRACE("%s %p\n", debugstr_a(x), y); - /* check for no scheme in string start */ - /* (apparently schemes *must* be larger than a single character) */ - if ((*x == '\0') || (y->cchProtocol <= 1)) { + if(y->cbSize != sizeof(*y)) + return E_INVALIDARG; + + while(*ptr && (isalnum(*ptr) || *ptr == '-')) + ptr++; + + if (*ptr != ':' || ptr <= x+1) { y->pszProtocol = NULL; return 0x80041001; } - /* found scheme, set length of remainder */ - y->cchSuffix = lstrlenA(y->pszSuffix); + y->pszProtocol = x; + y->cchProtocol = ptr-x; + y->pszSuffix = ptr+1; + y->cchSuffix = strlen(y->pszSuffix); - len = MultiByteToWideChar(CP_ACP, 0, y->pszProtocol, y->cchProtocol, - scheme, sizeof(scheme)/sizeof(WCHAR)); + len = MultiByteToWideChar(CP_ACP, 0, x, ptr-x, + scheme, sizeof(scheme)/sizeof(WCHAR)); y->nScheme = get_scheme_code(scheme, len); return S_OK;