[PATCH] ole32: Call individual UserFree() functions in STGMEDIUM_UserFree().

Zebediah Figura z.figura12 at gmail.com
Wed Dec 12 10:02:30 CST 2018


On 12/12/2018 05:00 AM, Huw Davies wrote:
> On Tue, Dec 11, 2018 at 03:25:36PM -0600, Zebediah Figura wrote:
>> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46270
>> Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
>> ---
>>   dlls/ole32/usrmarshal.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++---
>>   1 file changed, 48 insertions(+), 3 deletions(-)
>>
>> diff --git a/dlls/ole32/usrmarshal.c b/dlls/ole32/usrmarshal.c
>> index 772bff5f5e..e2a786098c 100644
>> --- a/dlls/ole32/usrmarshal.c
>> +++ b/dlls/ole32/usrmarshal.c
>> @@ -2036,11 +2036,56 @@ 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:
>> +        break;
>> +    case TYMED_HGLOBAL:
>> +        if (!med->pUnkForRelease)
>> +            HGLOBAL_UserFree(flags, &med->u.hGlobal);
>> +        break;
>> +    case TYMED_FILE:
>> +        if (med->u.lpszFileName)
>> +        {
>> +            if (!med->pUnkForRelease)
>> +                DeleteFileW(med->u.lpszFileName);
>> +            CoTaskMemFree(med->u.lpszFileName);
>> +        }
>> +        break;
>> +    case TYMED_ISTREAM:
>> +        if (med->u.pstm)
>> +            IStream_Release(med->u.pstm);
>> +        break;
>> +    case TYMED_ISTORAGE:
>> +        if (med->u.pstg)
>> +            IStorage_Release(med->u.pstg);
>> +        break;
>> +    case TYMED_GDI:
>> +        if (!med->pUnkForRelease)
>> +            HBITMAP_UserFree(flags, &med->u.hBitmap);
>> +        break;
>> +    case TYMED_MFPICT:
>> +        if (!med->pUnkForRelease)
>> +            HMETAFILEPICT_UserFree(flags, &med->u.hMetaFilePict);
>> +        break;
>> +    case TYMED_ENHMF:
>> +        if (!med->pUnkForRelease)
>> +            HENHMETAFILE_UserFree(flags, &med->u.hEnhMetaFile);
>> +        break;
>> +    default:
>> +        RaiseException(DV_E_TYMED, 0, 0, NULL);
>> +    }
>> +    med->tymed = TYMED_NULL;
>> +
>> +    if (med->pUnkForRelease)
>> +    {
>> +        IUnknown_Release(med->pUnkForRelease);
>> +        med->pUnkForRelease = NULL;
>> +    }
>>   }
> 
> Rather than re-coding ReleaseStgMedium() I think it would be neater to
> reuse it when we can.  Something like:
> 
> 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:
>      RaiseExeception(blah);
> }
> 
> Huw.
> 
> 

Sure, will do.



More information about the wine-devel mailing list