From: Kevin Puetz PuetzKevinA@JohnDeere.com
When CoMarshalInterface succeeds, it added an *additional* refcount represented by the marshaling data written to the stream. The original refcount returned from apartment_getclassobject needs to be released regardless of marshaling success or failure.
Signed-off-by: Kevin Puetz PuetzKevinA@JohnDeere.com --- dlls/combase/apartment.c | 4 ++-- dlls/ole32/tests/compobj.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/combase/apartment.c b/dlls/combase/apartment.c index 85e06a6fd57..62a043d4670 100644 --- a/dlls/combase/apartment.c +++ b/dlls/combase/apartment.c @@ -1098,8 +1098,8 @@ static HRESULT apartment_hostobject(struct apartment *apt, const struct host_obj return hr;
hr = CoMarshalInterface(params->stream, ¶ms->iid, object, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); - if (FAILED(hr)) - IUnknown_Release(object); + + IUnknown_Release(object); IStream_Seek(params->stream, llZero, STREAM_SEEK_SET, NULL);
return hr; diff --git a/dlls/ole32/tests/compobj.c b/dlls/ole32/tests/compobj.c index 1ebc92553f7..2955d15d2ee 100644 --- a/dlls/ole32/tests/compobj.c +++ b/dlls/ole32/tests/compobj.c @@ -796,7 +796,7 @@ static void test_CoGetClassObject(void) hr = CoGetClassObject(&CLSID_InProcFreeMarshaler, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void **)&pUnk); ok(hr == S_OK, "got 0x%08lx\n", hr); refs = IUnknown_Release(pUnk); - todo_wine ok(refs == 0, "Expected 0, got %lu\n", refs); + ok(refs == 0, "Expected 0, got %lu\n", refs);
/* context redefines FreeMarshaler CLSID */ if ((handle = activate_context(actctx_manifest, &cookie)))