From 6f917d49c1798eb7693c606c29fa1b65bce63171 Mon Sep 17 00:00:00 2001 From: Rob Shearman Date: Thu, 22 Nov 2007 19:08:23 +0000 Subject: [PATCH] ole32: Fix a race in find_proxy_manager. --- dlls/ole32/marshal.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/dlls/ole32/marshal.c b/dlls/ole32/marshal.c index fcfbd648a31..fde189a690f 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);