Jacek Caban : shlwapi: Make more strict restriction for URL scheme and fix error handling in ParseURLA .

Alexandre Julliard julliard at winehq.org
Mon Oct 19 09:56:09 CDT 2009


Module: wine
Branch: master
Commit: e57b8526b293560b5731f51f2b06c93b247077c9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e57b8526b293560b5731f51f2b06c93b247077c9

Author: Jacek Caban <jacek at 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;




More information about the wine-cvs mailing list