Module: wine Branch: master Commit: 8177b4793a18f90335da3cf56b6fdcf16bb07a6a URL: http://source.winehq.org/git/wine.git/?a=commit;h=8177b4793a18f90335da3cf56b...
Author: Octavian Voicu octavian.voicu@gmail.com Date: Thu Aug 25 18:50:20 2011 +0300
oleaut32: Fix leak in typelib marshaler when invoking IDispatch methods.
---
dlls/oleaut32/tests/tmarshal.c | 6 ++++++ dlls/oleaut32/tmarshal.c | 19 +++++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c index c2b36a5..c84aa47 100644 --- a/dlls/oleaut32/tests/tmarshal.c +++ b/dlls/oleaut32/tests/tmarshal.c @@ -1000,6 +1000,12 @@ static void test_typelibmarshal(void)
IKindaEnumWidget_Release(pKEW);
+ /* call GetTypeInfoCount (direct) */ + hr = IWidget_GetTypeInfoCount(pWidget, &uval); + ok_ole_success(hr, IWidget_GetTypeInfoCount); + hr = IWidget_GetTypeInfoCount(pWidget, &uval); + ok_ole_success(hr, IWidget_GetTypeInfoCount); + hr = IWidget_QueryInterface(pWidget, &IID_IDispatch, (void **)&pDispatch); ok_ole_success(hr, IWidget_QueryInterface);
diff --git a/dlls/oleaut32/tmarshal.c b/dlls/oleaut32/tmarshal.c index 42eaadd..25f0a0a 100644 --- a/dlls/oleaut32/tmarshal.c +++ b/dlls/oleaut32/tmarshal.c @@ -2002,16 +2002,19 @@ TMStubImpl_Invoke(
if (This->dispatch_derivative && xmsg->iMethod < sizeof(IDispatchVtbl)/sizeof(void *)) { - IPSFactoryBuffer *factory_buffer; - hres = get_facbuf_for_iid(&IID_IDispatch, &factory_buffer); - if (hres == S_OK) + if (!This->dispatch_stub) { - hres = IPSFactoryBuffer_CreateStub(factory_buffer, &IID_IDispatch, - This->pUnk, &This->dispatch_stub); - IPSFactoryBuffer_Release(factory_buffer); + IPSFactoryBuffer *factory_buffer; + hres = get_facbuf_for_iid(&IID_IDispatch, &factory_buffer); + if (hres == S_OK) + { + hres = IPSFactoryBuffer_CreateStub(factory_buffer, &IID_IDispatch, + This->pUnk, &This->dispatch_stub); + IPSFactoryBuffer_Release(factory_buffer); + } + if (hres != S_OK) + return hres; } - if (hres != S_OK) - return hres; return IRpcStubBuffer_Invoke(This->dispatch_stub, xmsg, rpcchanbuf); }