Module: wine Branch: refs/heads/master Commit: 91afe981e0571e7f2b3904b701dde166ed7dd178 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=91afe981e0571e7f2b3904b7...
Author: Robert Shearman rob@codeweavers.com Date: Mon May 8 15:54:34 2006 +0100
ole32: Fix infinite recursion in CompositeMonikerImpl_BindToStorage.
---
dlls/ole32/compositemoniker.c | 38 +++++++++++++++++++++++--------------- 1 files changed, 23 insertions(+), 15 deletions(-)
diff --git a/dlls/ole32/compositemoniker.c b/dlls/ole32/compositemoniker.c index 439fbca..fbeaa74 100644 --- a/dlls/ole32/compositemoniker.c +++ b/dlls/ole32/compositemoniker.c @@ -402,7 +402,7 @@ CompositeMonikerImpl_BindToStorage(IMoni IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult) { HRESULT res; - IMoniker *tempMk,*antiMk,*mostRigthMk; + IMoniker *tempMk,*antiMk,*mostRigthMk,*leftMk; IEnumMoniker *enumMoniker;
TRACE("(%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,riid,ppvResult); @@ -412,26 +412,34 @@ CompositeMonikerImpl_BindToStorage(IMoni /* This method recursively calls BindToStorage on the rightmost component of the composite, */ /* passing the rest of the composite as the pmkToLeft parameter for that call. */
- if (pmkToLeft!=NULL){ + if (pmkToLeft) + { + res = IMoniker_ComposeWith(pmkToLeft, iface, FALSE, &leftMk); + if (FAILED(res)) return res; + } + else + leftMk = iface;
- IMoniker_Enum(iface,FALSE,&enumMoniker); - IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL); - IEnumMoniker_Release(enumMoniker); + IMoniker_Enum(iface, FALSE, &enumMoniker); + IEnumMoniker_Next(enumMoniker, 1, &mostRigthMk, NULL); + IEnumMoniker_Release(enumMoniker);
- res=CreateAntiMoniker(&antiMk); - res=IMoniker_ComposeWith(iface,antiMk,0,&tempMk); - IMoniker_Release(antiMk); + res = CreateAntiMoniker(&antiMk); + if (FAILED(res)) return res; + res = IMoniker_ComposeWith(leftMk, antiMk, 0, &tempMk); + if (FAILED(res)) return res; + IMoniker_Release(antiMk);
- res=IMoniker_BindToStorage(mostRigthMk,pbc,tempMk,riid,ppvResult); + res = IMoniker_BindToStorage(mostRigthMk, pbc, tempMk, riid, ppvResult);
- IMoniker_Release(tempMk); + IMoniker_Release(tempMk);
- IMoniker_Release(mostRigthMk); + IMoniker_Release(mostRigthMk);
- return res; - } - else - return IMoniker_BindToStorage(iface,pbc,NULL,riid,ppvResult); + if (pmkToLeft) + IMoniker_Release(leftMk); + + return res; }
/******************************************************************************