From 037bdc0dc0ad4e1dc7e0026a18dd6c4e4be3346e Mon Sep 17 00:00:00 2001 From: Robert Shearman Date: Thu, 9 Jun 2005 09:45:59 +0000 Subject: [PATCH] IUnknown isn't a remotable interface so the stub manager shouldn't need a marshaller for it. --- dlls/ole32/marshal.c | 36 ++++++++++++++++++++++-------------- dlls/ole32/stubmanager.c | 4 ++-- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/dlls/ole32/marshal.c b/dlls/ole32/marshal.c index 6a1d907e24e..ce691921dd4 100644 --- a/dlls/ole32/marshal.c +++ b/dlls/ole32/marshal.c @@ -90,28 +90,36 @@ HRESULT marshal_object(APARTMENT *apt, STDOBJREF *stdobjref, REFIID riid, IUnkno struct stub_manager *manager; struct ifstub *ifstub; BOOL tablemarshal; - IRpcStubBuffer *stub; - IPSFactoryBuffer *psfb; + IRpcStubBuffer *stub = NULL; HRESULT hr; hr = apartment_getoxid(apt, &stdobjref->oxid); if (hr != S_OK) return hr; - hr = get_facbuf_for_iid(riid, &psfb); - if (hr != S_OK) + /* IUnknown doesn't require a stub buffer, because it never goes out on + * the wire */ + if (!IsEqualIID(riid, &IID_IUnknown)) { - ERR("couldn't get IPSFactory buffer for interface %s\n", debugstr_guid(riid)); - return hr; - } + IPSFactoryBuffer *psfb; - hr = IPSFactoryBuffer_CreateStub(psfb, riid, obj, &stub); - IPSFactoryBuffer_Release(psfb); - if (hr != S_OK) - { - ERR("Failed to create an IRpcStubBuffer from IPSFactory for %s\n", debugstr_guid(riid)); - return hr; + hr = get_facbuf_for_iid(riid, &psfb); + if (hr != S_OK) + { + ERR("couldn't get IPSFactory buffer for interface %s\n", debugstr_guid(riid)); + return hr; + } + + hr = IPSFactoryBuffer_CreateStub(psfb, riid, obj, &stub); + IPSFactoryBuffer_Release(psfb); + if (hr != S_OK) + { + ERR("Failed to create an IRpcStubBuffer from IPSFactory for %s\n", debugstr_guid(riid)); + return hr; + } } + else /* need to addref object anyway */ + IUnknown_AddRef(obj); if (mshlflags & MSHLFLAGS_NOPING) stdobjref->flags = SORF_NOPING; @@ -129,7 +137,7 @@ HRESULT marshal_object(APARTMENT *apt, STDOBJREF *stdobjref, REFIID riid, IUnkno manager = new_stub_manager(apt, obj, mshlflags); if (!manager) { - IRpcStubBuffer_Release(stub); + if (stub) IRpcStubBuffer_Release(stub); return E_OUTOFMEMORY; } } diff --git a/dlls/ole32/stubmanager.c b/dlls/ole32/stubmanager.c index 998d1ed47ef..76cc8fa54a5 100644 --- a/dlls/ole32/stubmanager.c +++ b/dlls/ole32/stubmanager.c @@ -409,7 +409,7 @@ struct ifstub *stub_manager_new_ifstub(struct stub_manager *m, IRpcStubBuffer *s if (!stub) return NULL; stub->stubbuffer = sb; - IUnknown_AddRef(sb); + if (sb) IRpcStubBuffer_AddRef(sb); /* no need to ref this, same object as sb */ stub->iface = iptr; @@ -446,7 +446,7 @@ static void stub_manager_delete_ifstub(struct stub_manager *m, struct ifstub *if RPC_UnregisterInterface(&ifstub->iid); - IUnknown_Release(ifstub->stubbuffer); + if (ifstub->stubbuffer) IUnknown_Release(ifstub->stubbuffer); IUnknown_Release(ifstub->iface); HeapFree(GetProcessHeap(), 0, ifstub); -- 2.11.4.GIT