shlwapi: Make UrlCanonicalizeA working with long urls (>INTERNET_MAX_URL_LENGTH).
authorPiotr Caban <piotr@codeweavers.com>
Sat, 8 May 2010 16:00:49 +0000 (18:00 +0200)
committerAlexandre Julliard <julliard@winehq.org>
Sat, 8 May 2010 16:14:43 +0000 (18:14 +0200)
dlls/shlwapi/url.c

index 28ea8188a38b694db6d98b49a9e7efa77cd1e25d..ad7d989a4bbd3bd869774ad28ef09c09517975f8 100644 (file)
@@ -232,40 +232,34 @@ HRESULT WINAPI ParseURLW(LPCWSTR x, PARSEDURLW *y)
 HRESULT WINAPI UrlCanonicalizeA(LPCSTR pszUrl, LPSTR pszCanonicalized,
        LPDWORD pcchCanonicalized, DWORD dwFlags)
 {
-    LPWSTR base, canonical;
+    LPWSTR url, canonical;
     HRESULT ret;
-    DWORD   len, len2;
+    DWORD   len;
 
     TRACE("(%s, %p, %p, 0x%08x) *pcchCanonicalized: %d\n", debugstr_a(pszUrl), pszCanonicalized,
         pcchCanonicalized, dwFlags, pcchCanonicalized ? *pcchCanonicalized : -1);
 
-    if(!pszUrl || !pszCanonicalized || !pcchCanonicalized)
+    if(!pszUrl || !pszCanonicalized || !pcchCanonicalized || !*pcchCanonicalized)
        return E_INVALIDARG;
 
-    base = HeapAlloc(GetProcessHeap(), 0,
-                             (2*INTERNET_MAX_URL_LENGTH) * sizeof(WCHAR));
-    canonical = base + INTERNET_MAX_URL_LENGTH;
+    len = strlen(pszUrl)+1;
+    url = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
+    canonical = HeapAlloc(GetProcessHeap(), 0, *pcchCanonicalized*sizeof(WCHAR));
+    if(!url || !canonical) {
+        HeapFree(GetProcessHeap(), 0, url);
+        HeapFree(GetProcessHeap(), 0, canonical);
+        return E_OUTOFMEMORY;
+    }
 
-    MultiByteToWideChar(0, 0, pszUrl, -1, base, INTERNET_MAX_URL_LENGTH);
-    len = INTERNET_MAX_URL_LENGTH;
+    MultiByteToWideChar(0, 0, pszUrl, -1, url, len);
 
-    ret = UrlCanonicalizeW(base, canonical, &len, dwFlags);
-    if (ret != S_OK) {
-        *pcchCanonicalized = len * 2;
-        HeapFree(GetProcessHeap(), 0, base);
-        return ret;
-    }
+    ret = UrlCanonicalizeW(url, canonical, pcchCanonicalized, dwFlags);
+    if(ret == S_OK)
+        WideCharToMultiByte(0, 0, canonical, -1, pszCanonicalized,
+                *pcchCanonicalized+1, 0, 0);
 
-    len2 = WideCharToMultiByte(0, 0, canonical, -1, 0, 0, 0, 0);
-    if (len2 > *pcchCanonicalized) {
-        *pcchCanonicalized = len2;
-        HeapFree(GetProcessHeap(), 0, base);
-        return E_POINTER;
-    }
-    WideCharToMultiByte(0, 0, canonical, -1, pszCanonicalized, *pcchCanonicalized, 0, 0);
-    *pcchCanonicalized = len;
-    HeapFree(GetProcessHeap(), 0, base);
-    return S_OK;
+    HeapFree(GetProcessHeap(), 0, canonical);
+    return ret;
 }
 
 /*************************************************************************