[PATCH] urlmon: Use a critical_section for the zonemanager
Detlef Riekenberg
wine.dev at web.de
Wed Jun 24 17:04:23 CDT 2009
---
dlls/urlmon/sec_mgr.c | 24 ++++++++++++++++++++++++
1 files changed, 24 insertions(+), 0 deletions(-)
diff --git a/dlls/urlmon/sec_mgr.c b/dlls/urlmon/sec_mgr.c
index cdf11f6..4bdc65e 100644
--- a/dlls/urlmon/sec_mgr.c
+++ b/dlls/urlmon/sec_mgr.c
@@ -46,6 +46,17 @@ static const WCHAR wszZonesKey[] = {'S','o','f','t','w','a','r','e','\\',
'I','n','t','e','r','n','e','t',' ','S','e','t','t','i','n','g','s','\\',
'Z','o','n','e','s','\\',0};
+
+static CRITICAL_SECTION zonemanager_cs;
+static CRITICAL_SECTION_DEBUG zonemanager_cs_debug =
+{
+ 0, 0, &zonemanager_cs,
+ { &zonemanager_cs_debug.ProcessLocksList, &zonemanager_cs_debug.ProcessLocksList },
+ 0, 0, { (DWORD_PTR)(__FILE__ ": zonemanager_cs") }
+};
+static CRITICAL_SECTION zonemanager_cs = { &zonemanager_cs_debug, -1, 0, 0, 0, 0 };
+
+
/********************************************************************
* get_string_from_reg [internal]
*
@@ -777,6 +788,7 @@ static ULONG WINAPI ZoneMgrImpl_Release(IInternetZoneManager* iface)
TRACE("(%p)->(ref before=%u)\n",This, refCount + 1);
if(!refCount) {
+ EnterCriticalSection(&zonemanager_cs);
count = This->have_maps;
while (count) {
/* Free all Zone Enumerator */
@@ -784,6 +796,7 @@ static ULONG WINAPI ZoneMgrImpl_Release(IInternetZoneManager* iface)
heap_free(This->zonemaps[count]);
}
heap_free(This->zonemaps);
+ LeaveCriticalSection(&zonemanager_cs);
heap_free(This);
URLMON_UnlockModule();
}
@@ -952,9 +965,11 @@ static HRESULT WINAPI ZoneMgrImpl_CreateZoneEnumerator(IInternetZoneManager* ifa
if (!data)
return E_FAIL;
+ EnterCriticalSection(&zonemanager_cs);
for (i = 0; i < This->have_maps; i++) {
if (This->zonemaps && !This->zonemaps[i]) {
This->zonemaps[i] = data;
+ LeaveCriticalSection(&zonemanager_cs);
*pdwEnum = i;
*pdwCount = data[0];
return S_OK;
@@ -968,6 +983,7 @@ static HRESULT WINAPI ZoneMgrImpl_CreateZoneEnumerator(IInternetZoneManager* ifa
if (!new_maps) {
heap_free(data);
+ LeaveCriticalSection(&zonemanager_cs);
return E_FAIL;
}
This->zonemaps = new_maps;
@@ -975,6 +991,7 @@ static HRESULT WINAPI ZoneMgrImpl_CreateZoneEnumerator(IInternetZoneManager* ifa
This->zonemaps[i] = data;
This->zonemaps[i + 1] = NULL;
+ LeaveCriticalSection(&zonemanager_cs);
*pdwEnum = i;
*pdwCount = data[0];
return S_OK;
@@ -993,15 +1010,18 @@ static HRESULT WINAPI ZoneMgrImpl_GetZoneAt(IInternetZoneManager* iface,
TRACE("(%p)->(0x%08x, %d, %p)\n", This, dwEnum, dwIndex, pdwZone);
+ EnterCriticalSection(&zonemanager_cs);
/* make sure, that dwEnum and dwIndex are in the valid range */
if (dwEnum < This->have_maps) {
if ((data = This->zonemaps[dwEnum])) {
if (dwIndex < data[0]) {
*pdwZone = data[dwIndex + 1];
+ LeaveCriticalSection(&zonemanager_cs);
return S_OK;
}
}
}
+ LeaveCriticalSection(&zonemanager_cs);
return E_INVALIDARG;
}
@@ -1015,14 +1035,18 @@ static HRESULT WINAPI ZoneMgrImpl_DestroyZoneEnumerator(IInternetZoneManager* if
LPDWORD data;
TRACE("(%p)->(0x%08x)\n", This, dwEnum);
+
+ EnterCriticalSection(&zonemanager_cs);
/* make sure, that dwEnum is valid */
if (dwEnum < This->have_maps) {
if ((data = This->zonemaps[dwEnum])) {
This->zonemaps[dwEnum] = NULL;
heap_free(data);
+ LeaveCriticalSection(&zonemanager_cs);
return S_OK;
}
}
+ LeaveCriticalSection(&zonemanager_cs);
return E_INVALIDARG;
}
--
1.5.4.3
--=-1SiLUMbm5m86EIDovPd4--
More information about the wine-patches
mailing list