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.
This commit is contained in:
parent
9e799f2054
commit
fa8472c35a
|
@ -1746,13 +1746,19 @@ static const IMarshalVtbl VT_MarshalImpl =
|
||||||
* Composite-Moniker_Construct (local function)
|
* Composite-Moniker_Construct (local function)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
static HRESULT
|
static HRESULT
|
||||||
CompositeMonikerImpl_Construct(CompositeMonikerImpl* This,
|
CompositeMonikerImpl_Construct(CompositeMonikerImpl** ppThis,
|
||||||
LPMONIKER pmkFirst, LPMONIKER pmkRest)
|
LPMONIKER pmkFirst, LPMONIKER pmkRest)
|
||||||
{
|
{
|
||||||
DWORD mkSys;
|
DWORD mkSys;
|
||||||
IEnumMoniker *enumMoniker;
|
IEnumMoniker *enumMoniker;
|
||||||
IMoniker *tempMk;
|
IMoniker *tempMk;
|
||||||
HRESULT res;
|
HRESULT res;
|
||||||
|
CompositeMonikerImpl *This;
|
||||||
|
|
||||||
|
*ppThis = This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
|
||||||
|
|
||||||
|
if (!This)
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
TRACE("(%p,%p,%p)\n",This,pmkFirst,pmkRest);
|
TRACE("(%p,%p,%p)\n",This,pmkFirst,pmkRest);
|
||||||
|
|
||||||
|
@ -1769,6 +1775,9 @@ CompositeMonikerImpl_Construct(CompositeMonikerImpl* This,
|
||||||
if (This->tabMoniker==NULL)
|
if (This->tabMoniker==NULL)
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
if (!pmkFirst && !pmkRest)
|
||||||
|
return S_OK;
|
||||||
|
|
||||||
IMoniker_IsSystemMoniker(pmkFirst,&mkSys);
|
IMoniker_IsSystemMoniker(pmkFirst,&mkSys);
|
||||||
|
|
||||||
/* put the first moniker contents in the beginning of the table */
|
/* put the first moniker contents in the beginning of the table */
|
||||||
|
@ -1918,26 +1927,12 @@ CreateGenericComposite(LPMONIKER pmkFirst, LPMONIKER pmkRest,
|
||||||
else if (pmkFirst==NULL && pmkRest==NULL)
|
else if (pmkFirst==NULL && pmkRest==NULL)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
newCompositeMoniker = HeapAlloc(GetProcessHeap(), 0,sizeof(CompositeMonikerImpl));
|
hr = CompositeMonikerImpl_Construct(&newCompositeMoniker,pmkFirst,pmkRest);
|
||||||
|
|
||||||
if (newCompositeMoniker == 0)
|
if (FAILED(hr))
|
||||||
return STG_E_INSUFFICIENTMEMORY;
|
|
||||||
|
|
||||||
hr = CompositeMonikerImpl_Construct(newCompositeMoniker,pmkFirst,pmkRest);
|
|
||||||
|
|
||||||
if (FAILED(hr)){
|
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(),0,newCompositeMoniker);
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
|
||||||
if (newCompositeMoniker->tabLastIndex==1)
|
|
||||||
|
|
||||||
hr = IMoniker_QueryInterface(newCompositeMoniker->tabMoniker[0],&IID_IMoniker,(void**)ppmkComposite);
|
return IMoniker_QueryInterface((IMoniker*)newCompositeMoniker,&IID_IMoniker,(void**)ppmkComposite);
|
||||||
else
|
|
||||||
|
|
||||||
hr = IMoniker_QueryInterface((IMoniker*)newCompositeMoniker,&IID_IMoniker,(void**)ppmkComposite);
|
|
||||||
|
|
||||||
return hr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
|
Loading…
Reference in New Issue