From: Zebediah Figura Subject: [PATCH v2] ole32: Call individual UserFree() functions in STGMEDIUM_UserFree(). Message-Id: <20181213025500.11352-1-z.figura12@gmail.com> Date: Wed, 12 Dec 2018 20:55:00 -0600 Essentially written by Huw Davies. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46270 Signed-off-by: Zebediah Figura --- dlls/ole32/usrmarshal.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/dlls/ole32/usrmarshal.c b/dlls/ole32/usrmarshal.c index 772bff5f5e..fafdcbb171 100644 --- a/dlls/ole32/usrmarshal.c +++ b/dlls/ole32/usrmarshal.c @@ -2036,11 +2036,37 @@ unsigned char * __RPC_USER STGMEDIUM_UserUnmarshal(ULONG *pFlags, unsigned char * which the first parameter is a ULONG. * This function is only intended to be called by the RPC runtime. */ -void __RPC_USER STGMEDIUM_UserFree(ULONG *pFlags, STGMEDIUM *pStgMedium) +void __RPC_USER STGMEDIUM_UserFree(ULONG *flags, STGMEDIUM *med) { - TRACE("(%s, %p\n", debugstr_user_flags(pFlags), pStgMedium); + TRACE("(%s, %p)\n", debugstr_user_flags(flags), med); - ReleaseStgMedium(pStgMedium); + switch(med->tymed) + { + case TYMED_NULL: + case TYMED_FILE: + case TYMED_ISTREAM: + case TYMED_ISTORAGE: + ReleaseStgMedium(med); + break; + case TYMED_HGLOBAL: + case TYMED_GDI: + case TYMED_MFPICT: + case TYMED_ENHMF: + if (LOWORD(*flags) == MSHCTX_INPROC) + { + if (med->pUnkForRelease) + { + IUnknown_Release(med->pUnkForRelease); + med->pUnkForRelease = NULL; + } + med->tymed = TYMED_NULL; + } + else + ReleaseStgMedium(med); + break; + default: + RaiseException(DV_E_TYMED, 0, 0, NULL); + } } ULONG __RPC_USER ASYNC_STGMEDIUM_UserSize(ULONG *pFlags, ULONG StartingSize, ASYNC_STGMEDIUM *pStgMedium) -- 2.14.1