Robert Shearman : ole32: Allocate memory for the generic composite moniker in CompositeMonikerImpl_Construct .

Alexandre Julliard julliard at wine.codeweavers.com
Mon May 8 09:06:12 CDT 2006


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

Author: Robert Shearman <rob at codeweavers.com>
Date:   Mon May  8 12:40:52 2006 +0100

ole32: Allocate memory for the generic composite moniker in CompositeMonikerImpl_Construct.

Don't leak memory in the case of newCompositeMoniker->tabLastIndex == 1, 
which can't happen anyway.
Allow construction of a moniker with no sub-monikers.

---

 dlls/ole32/compositemoniker.c |   31 +++++++++++++------------------
 1 files changed, 13 insertions(+), 18 deletions(-)

diff --git a/dlls/ole32/compositemoniker.c b/dlls/ole32/compositemoniker.c
index 2673fda..c8f1dfa 100644
--- a/dlls/ole32/compositemoniker.c
+++ b/dlls/ole32/compositemoniker.c
@@ -1746,13 +1746,19 @@ static const IMarshalVtbl VT_MarshalImpl
  *         Composite-Moniker_Construct (local function)
  *******************************************************************************/
 static HRESULT
-CompositeMonikerImpl_Construct(CompositeMonikerImpl* This,
+CompositeMonikerImpl_Construct(CompositeMonikerImpl** ppThis,
                LPMONIKER pmkFirst, LPMONIKER pmkRest)
 {
     DWORD mkSys;
     IEnumMoniker *enumMoniker;
     IMoniker *tempMk;
     HRESULT res;
+    CompositeMonikerImpl *This;
+
+    *ppThis = This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
+
+    if (!This)
+        return E_OUTOFMEMORY;
 
     TRACE("(%p,%p,%p)\n",This,pmkFirst,pmkRest);
 
@@ -1769,6 +1775,9 @@ CompositeMonikerImpl_Construct(Composite
     if (This->tabMoniker==NULL)
         return E_OUTOFMEMORY;
 
+    if (!pmkFirst && !pmkRest)
+        return S_OK;
+
     IMoniker_IsSystemMoniker(pmkFirst,&mkSys);
 
     /* put the first moniker contents in the beginning of the table */
@@ -1918,26 +1927,12 @@ CreateGenericComposite(LPMONIKER pmkFirs
     else  if (pmkFirst==NULL && pmkRest==NULL)
         return S_OK;
 
-    newCompositeMoniker = HeapAlloc(GetProcessHeap(), 0,sizeof(CompositeMonikerImpl));
-
-    if (newCompositeMoniker == 0)
-        return STG_E_INSUFFICIENTMEMORY;
-
-    hr = CompositeMonikerImpl_Construct(newCompositeMoniker,pmkFirst,pmkRest);
-
-    if (FAILED(hr)){
+    hr = CompositeMonikerImpl_Construct(&newCompositeMoniker,pmkFirst,pmkRest);
 
-        HeapFree(GetProcessHeap(),0,newCompositeMoniker);
+    if (FAILED(hr))
         return hr;
-    }
-    if (newCompositeMoniker->tabLastIndex==1)
-
-        hr = IMoniker_QueryInterface(newCompositeMoniker->tabMoniker[0],&IID_IMoniker,(void**)ppmkComposite);
-    else
-
-        hr = IMoniker_QueryInterface((IMoniker*)newCompositeMoniker,&IID_IMoniker,(void**)ppmkComposite);
 
-    return hr;
+    return IMoniker_QueryInterface((IMoniker*)newCompositeMoniker,&IID_IMoniker,(void**)ppmkComposite);
 }
 
 /******************************************************************************




More information about the wine-cvs mailing list