Jacek Caban : urlmon: CoInternetGetSecurityUrl rewrite.

Alexandre Julliard julliard at winehq.org
Tue Feb 8 17:23:48 CST 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Feb  8 15:16:38 2011 +0100

urlmon: CoInternetGetSecurityUrl rewrite.

This includes proper URL buffers, error handling and wrong pluggable 
protocol calls fixes.

---

 dlls/urlmon/sec_mgr.c |  202 +++++++++++++++++++++++++++++++++---------------
 1 files changed, 139 insertions(+), 63 deletions(-)

diff --git a/dlls/urlmon/sec_mgr.c b/dlls/urlmon/sec_mgr.c
index 2aca1a9..4206d5d 100644
--- a/dlls/urlmon/sec_mgr.c
+++ b/dlls/urlmon/sec_mgr.c
@@ -1299,87 +1299,163 @@ HRESULT WINAPI CoInternetCreateZoneManager(IServiceProvider* pSP, IInternetZoneM
     return ZoneMgrImpl_Construct(NULL, (void**)ppZM);
 }
 
-/********************************************************************
- *      CoInternetGetSecurityUrl (URLMON.@)
- */
-HRESULT WINAPI CoInternetGetSecurityUrl(LPCWSTR pwzUrl, LPWSTR *ppwzSecUrl, PSUACTION psuAction, DWORD dwReserved)
-{
-    WCHAR buf1[INTERNET_MAX_URL_LENGTH], buf2[INTERNET_MAX_URL_LENGTH];
-    LPWSTR url, domain;
-    DWORD len;
-    HRESULT hres;
+static HRESULT parse_security_url(const WCHAR *url, PSUACTION action, WCHAR **result) {
+    IInternetProtocolInfo *protocol_info;
+    WCHAR *tmp, *new_url = NULL, *alloc_url = NULL;
+    DWORD size, new_size;
+    HRESULT hres = S_OK, parse_hres;
 
-    TRACE("(%p,%p,%u,%u)\n", pwzUrl, ppwzSecUrl, psuAction, dwReserved);
+    while(1) {
+        TRACE("parsing %s\n", debugstr_w(url));
 
-    url = buf1;
-    domain = buf2;
-    strcpyW(url, pwzUrl);
+        protocol_info = get_protocol_info(url);
+        if(!protocol_info)
+            break;
 
-    while(1) {
-        hres = CoInternetParseUrl(url, PARSE_SECURITY_URL, 0, domain, INTERNET_MAX_URL_LENGTH, &len, 0);
-        if(hres!=S_OK || !strcmpW(url, domain))
+        size = strlenW(url)+1;
+        new_url = CoTaskMemAlloc(size*sizeof(WCHAR));
+        if(!new_url) {
+            hres = E_OUTOFMEMORY;
             break;
+        }
 
-        if(url == buf1) {
-            url = buf2;
-            domain = buf1;
-        } else {
-            url = buf1;
-            domain = buf2;
+        new_size = 0;
+        parse_hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_SECURITY_URL, 0, new_url, size, &new_size, 0);
+        if(parse_hres == S_FALSE) {
+            if(!new_size) {
+                hres = E_UNEXPECTED;
+                break;
+            }
+
+            tmp = CoTaskMemRealloc(new_url, new_size*sizeof(WCHAR));
+            if(!tmp) {
+                hres = E_OUTOFMEMORY;
+                break;
+            }
+            new_url = tmp;
+            parse_hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_SECURITY_URL, 0, new_url,
+                    new_size, &new_size, 0);
+            if(parse_hres == S_FALSE) {
+                hres = E_FAIL;
+                break;
+            }
         }
-    }
 
-    if(psuAction==PSU_SECURITY_URL_ONLY) {
-        len = lstrlenW(url)+1;
-        *ppwzSecUrl = CoTaskMemAlloc(len*sizeof(WCHAR));
-        if(!*ppwzSecUrl)
-            return E_OUTOFMEMORY;
+        if(parse_hres != S_OK || !strcmpW(url, new_url))
+            break;
 
-        memcpy(*ppwzSecUrl, url, len*sizeof(WCHAR));
-        return S_OK;
+        CoTaskMemFree(alloc_url);
+        url = alloc_url = new_url;
+        new_url = NULL;
     }
 
-    hres = CoInternetParseUrl(url, PARSE_SECURITY_DOMAIN, 0, domain,
-            INTERNET_MAX_URL_LENGTH, &len, 0);
-    if(SUCCEEDED(hres)) {
-        len++;
-        *ppwzSecUrl = CoTaskMemAlloc(len*sizeof(WCHAR));
-        if(!*ppwzSecUrl)
-            return E_OUTOFMEMORY;
+    CoTaskMemFree(new_url);
 
-        memcpy(*ppwzSecUrl, domain, len*sizeof(WCHAR));
-        return S_OK;
+    if(hres != S_OK) {
+        WARN("failed: %08x\n", hres);
+        CoTaskMemFree(alloc_url);
+        return hres;
     }
 
-    hres = CoInternetParseUrl(url, PARSE_SCHEMA, 0, domain,
-            INTERNET_MAX_URL_LENGTH, &len, 0);
-    if(hres == S_OK){
-        const WCHAR fileW[] = {'f','i','l','e',0};
-        if(!strcmpW(domain, fileW)){
-            hres = CoInternetParseUrl(url, PARSE_ROOTDOCUMENT, 0, domain, INTERNET_MAX_URL_LENGTH, &len, 0);
-        }else{
-            domain[len] = ':';
-            hres = CoInternetParseUrl(url, PARSE_DOMAIN, 0, domain+len+1,
-                    INTERNET_MAX_URL_LENGTH-len-1, &len, 0);
-            if(hres == S_OK) {
-                len = lstrlenW(domain)+1;
-                *ppwzSecUrl = CoTaskMemAlloc(len*sizeof(WCHAR));
-                if(!*ppwzSecUrl)
-                    return E_OUTOFMEMORY;
-
-                memcpy(*ppwzSecUrl, domain, len*sizeof(WCHAR));
-                return S_OK;
+    if(action == PSU_DEFAULT && (protocol_info = get_protocol_info(url))) {
+        size = strlenW(url)+1;
+        new_url = CoTaskMemAlloc(size * sizeof(WCHAR));
+        if(new_url) {
+            new_size = 0;
+            parse_hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_SECURITY_DOMAIN, 0,
+                    new_url, size, &new_size, 0);
+            if(parse_hres == S_FALSE) {
+                if(new_size) {
+                    tmp = CoTaskMemRealloc(new_url, new_size*sizeof(WCHAR));
+                    if(tmp) {
+                        new_url = tmp;
+                        parse_hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_SECURITY_DOMAIN, 0, new_url,
+                                new_size, &new_size, 0);
+                        if(parse_hres == S_FALSE)
+                            hres = E_FAIL;
+                    }else {
+                        hres = E_OUTOFMEMORY;
+                    }
+                }else {
+                    hres = E_UNEXPECTED;
+                }
+            }
+
+            if(hres == S_OK && parse_hres == S_OK) {
+                CoTaskMemFree(alloc_url);
+                url = alloc_url = new_url;
+                new_url = NULL;
             }
+
+            CoTaskMemFree(new_url);
+        }else {
+            hres = E_OUTOFMEMORY;
         }
-    }else
+        IInternetProtocolInfo_Release(protocol_info);
+    }
+
+    if(FAILED(hres)) {
+        WARN("failed %08x\n", hres);
+        CoTaskMemFree(alloc_url);
         return hres;
+    }
 
-    len = lstrlenW(url)+1;
-    *ppwzSecUrl = CoTaskMemAlloc(len*sizeof(WCHAR));
-    if(!*ppwzSecUrl)
-        return E_OUTOFMEMORY;
+    if(!alloc_url) {
+        size = strlenW(url)+1;
+        alloc_url = CoTaskMemAlloc(size * sizeof(WCHAR));
+        if(!alloc_url)
+            return E_OUTOFMEMORY;
+        memcpy(alloc_url, url, size * sizeof(WCHAR));
+    }
+
+    *result = alloc_url;
+    return S_OK;
+}
+
+/********************************************************************
+ *      CoInternetGetSecurityUrl (URLMON.@)
+ */
+HRESULT WINAPI CoInternetGetSecurityUrl(LPCWSTR pwzUrl, LPWSTR *ppwzSecUrl, PSUACTION psuAction, DWORD dwReserved)
+{
+    WCHAR *secure_url;
+    HRESULT hres;
+
+    TRACE("(%p,%p,%u,%u)\n", pwzUrl, ppwzSecUrl, psuAction, dwReserved);
+
+    hres = parse_security_url(pwzUrl, psuAction, &secure_url);
+    if(FAILED(hres))
+        return hres;
+
+    if(psuAction != PSU_SECURITY_URL_ONLY) {
+        PARSEDURLW parsed_url = { sizeof(parsed_url) };
+        DWORD size;
+
+        /* FIXME: Use helpers from uri.c */
+        if(SUCCEEDED(ParseURLW(secure_url, &parsed_url))) {
+            WCHAR *new_url;
+
+            switch(parsed_url.nScheme) {
+            case URL_SCHEME_FTP:
+            case URL_SCHEME_HTTP:
+            case URL_SCHEME_HTTPS:
+                size = strlenW(secure_url)+1;
+                new_url = CoTaskMemAlloc(size * sizeof(WCHAR));
+                if(new_url)
+                    hres = UrlGetPartW(secure_url, new_url, &size, URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME);
+                else
+                    hres = E_OUTOFMEMORY;
+                CoTaskMemFree(secure_url);
+                if(hres != S_OK) {
+                    WARN("UrlGetPart failed: %08x\n", hres);
+                    CoTaskMemFree(new_url);
+                    return FAILED(hres) ? hres : E_FAIL;
+                }
+                secure_url = new_url;
+            }
+        }
+    }
 
-    memcpy(*ppwzSecUrl, url, len*sizeof(WCHAR));
+    *ppwzSecUrl = secure_url;
     return S_OK;
 }
 




More information about the wine-cvs mailing list