https://git.reactos.org/?p=reactos.git;a=commitdiff;h=959994b67cefbbfae862a7461c8ac25d486aab68
commit 959994b67cefbbfae862a7461c8ac25d486aab68 Author: Mark Jansen <mark.jan...@reactos.org> AuthorDate: Sun Dec 16 22:03:26 2018 +0100 Commit: Mark Jansen <mark.jan...@reactos.org> CommitDate: Mon Dec 17 20:36:05 2018 +0100 [OLE32] Don't free handles that are just copied in the inproc case. This imports wine commit 25b136d40080a80c006b89e02708d2e248504a42, by Huw Davies and Zebediah Figura CORE-14696 --- dll/win32/ole32/usrmarshal.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/dll/win32/ole32/usrmarshal.c b/dll/win32/ole32/usrmarshal.c index 8d36e13441..3d1284a431 100644 --- a/dll/win32/ole32/usrmarshal.c +++ b/dll/win32/ole32/usrmarshal.c @@ -2036,11 +2036,29 @@ 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) + med->tymed = TYMED_NULL; + ReleaseStgMedium(med); + break; + default: + RaiseException(DV_E_TYMED, 0, 0, NULL); + } } ULONG __RPC_USER ASYNC_STGMEDIUM_UserSize(ULONG *pFlags, ULONG StartingSize, ASYNC_STGMEDIUM *pStgMedium)