Rob Shearman : ole32: Fix a race in find_proxy_manager.

Alexandre Julliard julliard at winehq.org
Mon Nov 26 08:16:15 CST 2007


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

Author: Rob Shearman <rob at codeweavers.com>
Date:   Thu Nov 22 19:08:23 2007 +0000

ole32: Fix a race in find_proxy_manager.

---

 dlls/ole32/marshal.c |   13 +++++++++----
 1 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/dlls/ole32/marshal.c b/dlls/ole32/marshal.c
index fcfbd64..fde189a 100644
--- a/dlls/ole32/marshal.c
+++ b/dlls/ole32/marshal.c
@@ -1097,10 +1097,15 @@ static BOOL find_proxy_manager(APARTMENT * apt, OXID oxid, OID oid, struct proxy
         struct proxy_manager * proxy = LIST_ENTRY(cursor, struct proxy_manager, entry);
         if ((oxid == proxy->oxid) && (oid == proxy->oid))
         {
-            *proxy_found = proxy;
-            ClientIdentity_AddRef((IMultiQI *)&proxy->lpVtbl);
-            found = TRUE;
-            break;
+            /* be careful of a race with ClientIdentity_Release, which would
+             * cause us to return a proxy which is in the process of being
+             * destroyed */
+            if (ClientIdentity_AddRef((IMultiQI *)&proxy->lpVtbl) != 0)
+            {
+                *proxy_found = proxy;
+                found = TRUE;
+                break;
+            }
         }
     }
     LeaveCriticalSection(&apt->cs);




More information about the wine-cvs mailing list