Huw Davies : ole32: Don' t free handles that are just copied in the inproc case.
Alexandre Julliard
julliard at winehq.org
Thu Dec 13 15:45:04 CST 2018
Module: wine
Branch: master
Commit: 25b136d40080a80c006b89e02708d2e248504a42
URL: https://source.winehq.org/git/wine.git/?a=commit;h=25b136d40080a80c006b89e02708d2e248504a42
Author: Huw Davies <huw at codeweavers.com>
Date: Thu Dec 13 09:39:18 2018 +0000
ole32: Don't free handles that are just copied in the inproc case.
Based on a patch by Zebediah Figura.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46270
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ole32/usrmarshal.c | 24 +++++++++++++++++++++---
1 file changed, 21 insertions(+), 3 deletions(-)
diff --git a/dlls/ole32/usrmarshal.c b/dlls/ole32/usrmarshal.c
index 772bff5..9f19b66 100644
--- a/dlls/ole32/usrmarshal.c
+++ b/dlls/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)
More information about the wine-cvs
mailing list