Rob Shearman : ole32: Make proxy_manager_get_remunknown AddRef the return IRemUnknown object.

Alexandre Julliard julliard at wine.codeweavers.com
Tue May 22 07:00:09 CDT 2007


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

Author: Rob Shearman <rob at codeweavers.com>
Date:   Mon May 21 16:43:44 2007 +0100

ole32: Make proxy_manager_get_remunknown AddRef the return IRemUnknown object.

Fix up the callers to release the returned IRemUnknown object.

---

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

diff --git a/dlls/ole32/marshal.c b/dlls/ole32/marshal.c
index 759a683..9c7d53c 100644
--- a/dlls/ole32/marshal.c
+++ b/dlls/ole32/marshal.c
@@ -283,6 +283,7 @@ static HRESULT WINAPI ClientIdentity_QueryMultipleInterfaces(IMultiQI *iface, UL
         {
             hr = IRemUnknown_RemQueryInterface(remunk, ipid, NORMALEXTREFS,
                                                nonlocal_mqis, iids, &qiresults);
+            IRemUnknown_Release(remunk);
             if (FAILED(hr))
                 ERR("IRemUnknown_RemQueryInterface failed with error 0x%08x\n", hr);
         }
@@ -409,6 +410,7 @@ static HRESULT WINAPI Proxy_MarshalInterface(
                 rif.cPublicRefs = (mshlflags == MSHLFLAGS_TABLESTRONG) ? 1 : NORMALEXTREFS;
                 rif.cPrivateRefs = 0;
                 hr = IRemUnknown_RemAddRef(remunk, 1, &rif, &hrref);
+                IRemUnknown_Release(remunk);
                 if (hr == S_OK && hrref == S_OK)
                 {
                     /* table-strong marshaling doesn't give the refs to the
@@ -467,6 +469,7 @@ static HRESULT WINAPI Proxy_MarshalInterface(
             }
             else
                 ERR("IRemUnknown_RemQueryInterface failed with error 0x%08x\n", hr);
+            IRemUnknown_Release(remunk);
         }
     }
 
@@ -577,6 +580,7 @@ static HRESULT ifproxy_get_public_ref(struct ifproxy * This)
             rif.cPublicRefs = NORMALEXTREFS;
             rif.cPrivateRefs = 0;
             hr = IRemUnknown_RemAddRef(remunk, 1, &rif, &hrref);
+            IRemUnknown_Release(remunk);
             if (hr == S_OK && hrref == S_OK)
                 InterlockedExchangeAdd((LONG *)&This->refs, NORMALEXTREFS);
             else
@@ -614,6 +618,7 @@ static HRESULT ifproxy_release_public_refs(struct ifproxy * This)
             rif.cPublicRefs = public_refs;
             rif.cPrivateRefs = 0;
             hr = IRemUnknown_RemRelease(remunk, 1, &rif);
+            IRemUnknown_Release(remunk);
             if (hr == S_OK)
                 InterlockedExchangeAdd((LONG *)&This->refs, -public_refs);
             else if (hr == RPC_E_DISCONNECTED)
@@ -967,8 +972,11 @@ static HRESULT proxy_manager_get_remunknown(struct proxy_manager * This, IRemUnk
 
     EnterCriticalSection(&This->cs);
     if (This->remunk)
+    {
         /* already created - return existing object */
         *remunk = This->remunk;
+        IRemUnknown_AddRef(*remunk);
+    }
     else if (!This->parent)
         /* disconnected - we can't create IRemUnknown */
         hr = S_FALSE;
@@ -988,9 +996,12 @@ static HRESULT proxy_manager_get_remunknown(struct proxy_manager * This, IRemUnk
         /* do the unmarshal */
         hr = unmarshal_object(&stdobjref, This->parent, This->dest_context,
                               This->dest_context_data, &IID_IRemUnknown,
-                              &This->oxid_info, (void**)&This->remunk);
+                              &This->oxid_info, (void**)remunk);
         if (hr == S_OK)
-            *remunk = This->remunk;
+        {
+            This->remunk = *remunk;
+            IRemUnknown_AddRef(This->remunk);
+        }
     }
     LeaveCriticalSection(&This->cs);
 




More information about the wine-cvs mailing list