Module: wine Branch: refs/heads/master Commit: fa8472c35afdf805d654f4801f0e1baa62c95ee6 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=fa8472c35afdf805d654f480...
Author: Robert Shearman rob@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); }
/******************************************************************************