Octavian Voicu : oleaut32: Fix leak in typelib marshaler when invoking IDispatch methods.
Alexandre Julliard
julliard at winehq.org
Fri Aug 26 10:40:47 CDT 2011
Module: wine
Branch: master
Commit: 8177b4793a18f90335da3cf56b6fdcf16bb07a6a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8177b4793a18f90335da3cf56b6fdcf16bb07a6a
Author: Octavian Voicu <octavian.voicu at 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);
}
More information about the wine-cvs
mailing list