oleaut32: Fix leak in typelib marshaler when invoking IDispatch methods.
Octavian Voicu
octavian.voicu at gmail.com
Thu Aug 25 10:50:20 CDT 2011
A dispatch stub is created the first time an IDispatch method is invoked.
A new stub will be created if another IDispatch method is invoked, leaking
the original one.
---
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);
}
--
1.7.4.1
More information about the wine-patches
mailing list