Jacek Caban : urlmon: Move InternetParseUrl(PARSE_SECURITY_URL) call to map_url_to_zone and fix buffer size.
Alexandre Julliard
julliard at winehq.org
Fri Mar 14 08:29:32 CDT 2008
Module: wine
Branch: master
Commit: cc159d832deea4e0a4a5d28b9c8152d4be848637
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cc159d832deea4e0a4a5d28b9c8152d4be848637
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Mar 14 12:40:22 2008 +0100
urlmon: Move InternetParseUrl(PARSE_SECURITY_URL) call to map_url_to_zone and fix buffer size.
---
dlls/urlmon/sec_mgr.c | 161 ++++++++++++++++++++++++-------------------------
1 files changed, 80 insertions(+), 81 deletions(-)
diff --git a/dlls/urlmon/sec_mgr.c b/dlls/urlmon/sec_mgr.c
index 6ed72dc..59b2448 100644
--- a/dlls/urlmon/sec_mgr.c
+++ b/dlls/urlmon/sec_mgr.c
@@ -23,65 +23,27 @@
#include "urlmon_main.h"
#include "winreg.h"
+#include "wininet.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
-/***********************************************************************
- * InternetSecurityManager implementation
- *
- */
-typedef struct {
- const IInternetSecurityManagerVtbl* lpInternetSecurityManagerVtbl;
+static const WCHAR fileW[] = {'f','i','l','e',0};
- LONG ref;
-
- IInternetSecurityMgrSite *mgrsite;
- IInternetSecurityManager *custom_manager;
-} SecManagerImpl;
-
-#define SECMGR_THIS(iface) DEFINE_THIS(SecManagerImpl, InternetSecurityManager, iface)
-
-static HRESULT map_url_to_zone(LPCWSTR url, DWORD *zone)
+static HRESULT get_zone_from_reg(LPCWSTR schema, DWORD *zone)
{
- WCHAR schema[64];
- DWORD res, size=0;
+ DWORD res, size;
HKEY hkey;
- HRESULT hres;
static const WCHAR wszZoneMapProtocolKey[] =
{'S','o','f','t','w','a','r','e','\\',
- 'M','i','c','r','o','s','o','f','t','\\',
- 'W','i','n','d','o','w','s','\\',
- 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
- 'I','n','t','e','r','n','e','t',' ','S','e','t','t','i','n','g','s','\\',
- 'Z','o','n','e','M','a','p','\\',
- 'P','r','o','t','o','c','o','l','D','e','f','a','u','l','t','s',0};
- static const WCHAR wszFile[] = {'f','i','l','e',0};
-
- *zone = -1;
-
- hres = CoInternetParseUrl(url, PARSE_SCHEMA, 0, schema, sizeof(schema)/sizeof(WCHAR), &size, 0);
- if(FAILED(hres))
- return hres;
- if(!*schema)
- return E_INVALIDARG;
-
- /* file protocol is a special case */
- if(!strcmpW(schema, wszFile)) {
- WCHAR path[MAX_PATH];
-
- hres = CoInternetParseUrl(url, PARSE_PATH_FROM_URL, 0, path,
- sizeof(path)/sizeof(WCHAR), &size, 0);
-
- if(SUCCEEDED(hres) && strchrW(path, '\\')) {
- *zone = 0;
- return S_OK;
- }
- }
-
- WARN("domains are not yet implemented\n");
+ 'M','i','c','r','o','s','o','f','t','\\',
+ 'W','i','n','d','o','w','s','\\',
+ 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
+ 'I','n','t','e','r','n','e','t',' ','S','e','t','t','i','n','g','s','\\',
+ 'Z','o','n','e','M','a','p','\\',
+ 'P','r','o','t','o','c','o','l','D','e','f','a','u','l','t','s',0};
res = RegOpenKeyW(HKEY_CURRENT_USER, wszZoneMapProtocolKey, &hkey);
if(res != ERROR_SUCCESS) {
@@ -111,6 +73,65 @@ static HRESULT map_url_to_zone(LPCWSTR url, DWORD *zone)
return S_OK;
}
+static HRESULT map_url_to_zone(LPCWSTR url, DWORD *zone, LPWSTR *ret_url)
+{
+ LPWSTR secur_url;
+ WCHAR schema[64];
+ DWORD size=0;
+ HRESULT hres;
+
+ secur_url = heap_alloc(INTERNET_MAX_URL_LENGTH*sizeof(WCHAR));
+ *zone = -1;
+
+ hres = CoInternetParseUrl(url, PARSE_SECURITY_URL, 0, secur_url, INTERNET_MAX_URL_LENGTH, &size, 0);
+ if(hres != S_OK)
+ strcpyW(secur_url, url);
+
+ hres = CoInternetParseUrl(secur_url, PARSE_SCHEMA, 0, schema, sizeof(schema)/sizeof(WCHAR), &size, 0);
+ if(FAILED(hres) || !*schema) {
+ heap_free(secur_url);
+ return E_INVALIDARG;
+ }
+
+ /* file protocol is a special case */
+ if(!strcmpW(schema, fileW)) {
+ WCHAR path[MAX_PATH];
+
+ hres = CoInternetParseUrl(secur_url, PARSE_PATH_FROM_URL, 0, path,
+ sizeof(path)/sizeof(WCHAR), &size, 0);
+
+ if(SUCCEEDED(hres) && strchrW(path, '\\'))
+ *zone = 0;
+ }
+
+ if(*zone == -1) {
+ WARN("domains are not yet implemented\n");
+ hres = get_zone_from_reg(schema, zone);
+ }
+
+ if(FAILED(hres) || !ret_url)
+ heap_free(secur_url);
+ else
+ *ret_url = secur_url;
+
+ return hres;
+}
+
+/***********************************************************************
+ * InternetSecurityManager implementation
+ *
+ */
+typedef struct {
+ const IInternetSecurityManagerVtbl* lpInternetSecurityManagerVtbl;
+
+ LONG ref;
+
+ IInternetSecurityMgrSite *mgrsite;
+ IInternetSecurityManager *custom_manager;
+} SecManagerImpl;
+
+#define SECMGR_THIS(iface) DEFINE_THIS(SecManagerImpl, InternetSecurityManager, iface)
+
static HRESULT WINAPI SecManagerImpl_QueryInterface(IInternetSecurityManager* iface,REFIID riid,void** ppvObject)
{
SecManagerImpl *This = SECMGR_THIS(iface);
@@ -230,8 +251,6 @@ static HRESULT WINAPI SecManagerImpl_MapUrlToZone(IInternetSecurityManager *ifac
DWORD dwFlags)
{
SecManagerImpl *This = SECMGR_THIS(iface);
- LPWSTR url;
- DWORD size;
HRESULT hres;
TRACE("(%p)->(%s %p %08x)\n", iface, debugstr_w(pwszUrl), pdwZone, dwFlags);
@@ -251,26 +270,15 @@ static HRESULT WINAPI SecManagerImpl_MapUrlToZone(IInternetSecurityManager *ifac
if(dwFlags)
FIXME("not supported flags: %08x\n", dwFlags);
- size = (strlenW(pwszUrl)+16) * sizeof(WCHAR);
- url = heap_alloc(size);
-
- hres = CoInternetParseUrl(pwszUrl, PARSE_SECURITY_URL, 0, url, size/sizeof(WCHAR), &size, 0);
- if(FAILED(hres))
- memcpy(url, pwszUrl, size);
-
- hres = map_url_to_zone(url, pdwZone);
-
- heap_free(url);
-
- return hres;
+ return map_url_to_zone(pwszUrl, pdwZone, NULL);
}
static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManager *iface,
LPCWSTR pwszUrl, BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD_PTR dwReserved)
{
SecManagerImpl *This = SECMGR_THIS(iface);
- LPWSTR buf, ptr, ptr2;
- DWORD size, zone, len;
+ LPWSTR url, ptr, ptr2;
+ DWORD zone, len;
HRESULT hres;
static const WCHAR wszFile[] = {'f','i','l','e',':'};
@@ -291,26 +299,17 @@ static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManager *ifa
if(dwReserved)
FIXME("dwReserved is not supported\n");
- len = strlenW(pwszUrl)+1;
- buf = heap_alloc((len+16)*sizeof(WCHAR));
-
- hres = CoInternetParseUrl(pwszUrl, PARSE_SECURITY_URL, 0, buf, len, &size, 0);
+ hres = map_url_to_zone(pwszUrl, &zone, &url);
if(FAILED(hres))
- memcpy(buf, pwszUrl, len*sizeof(WCHAR));
-
- hres = map_url_to_zone(buf, &zone);
- if(FAILED(hres)) {
- heap_free(buf);
return hres == 0x80041001 ? E_INVALIDARG : hres;
- }
/* file protocol is a special case */
if(strlenW(pwszUrl) >= sizeof(wszFile)/sizeof(WCHAR)
- && !memcmp(buf, wszFile, sizeof(wszFile))) {
+ && !memcmp(url, wszFile, sizeof(wszFile))) {
static const BYTE secidFile[] = {'f','i','l','e',':'};
- heap_free(buf);
+ heap_free(url);
if(*pcbSecurityId < sizeof(secidFile)+sizeof(zone))
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
@@ -322,7 +321,7 @@ static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManager *ifa
return S_OK;
}
- ptr = strchrW(buf, ':');
+ ptr = strchrW(url, ':');
ptr2 = ++ptr;
while(*ptr2 == '/')
ptr2++;
@@ -333,15 +332,15 @@ static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManager *ifa
if(ptr)
*ptr = 0;
- len = WideCharToMultiByte(CP_ACP, 0, buf, -1, NULL, 0, NULL, NULL)-1;
+ len = WideCharToMultiByte(CP_ACP, 0, url, -1, NULL, 0, NULL, NULL)-1;
if(len+sizeof(DWORD) > *pcbSecurityId) {
- heap_free(buf);
+ heap_free(url);
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
}
- WideCharToMultiByte(CP_ACP, 0, buf, -1, (LPSTR)pbSecurityId, -1, NULL, NULL);
- heap_free(buf);
+ WideCharToMultiByte(CP_ACP, 0, url, -1, (LPSTR)pbSecurityId, -1, NULL, NULL);
+ heap_free(url);
*(DWORD*)(pbSecurityId+len) = zone;
More information about the wine-cvs
mailing list