[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