[PATCH] amstream: Initialize correctly AM_MEDIA_TYPE struct.

Christian Costa titan.costa at gmail.com
Thu Nov 15 20:14:25 CST 2012


Le 16/11/2012 00:24, Michael Stefaniuc a écrit :
> Hello Christian,
>
> On 11/15/2012 09:43 AM, Christian Costa wrote:
>> Fixes bug 32185.
>> ---
>>   dlls/amstream/mediastreamfilter.c |    2 ++
>>   1 file changed, 2 insertions(+)
>>
>> diff --git a/dlls/amstream/mediastreamfilter.c b/dlls/amstream/mediastreamfilter.c
>> index 9b2bd8e..d5388e5 100644
>> --- a/dlls/amstream/mediastreamfilter.c
>> +++ b/dlls/amstream/mediastreamfilter.c
>> @@ -132,6 +132,8 @@ static HRESULT WINAPI BasePinImp_GetMediaType(BasePin *This, int index, AM_MEDIA
>>       MSPID purpose_id;
>>       int i;
>>   
>> +    ZeroMemory(amt, sizeof(*amt));
>> +
> this looks "odd". There is no check if amt is NULL, at least that's what
> caught my attention. So I've looked around and stumbled upon the
> AM_MEDIA_TYPE structure documentation
> http://msdn.microsoft.com/en-us/library/windows/desktop/dd373477%28v=vs.85%29.aspx
>    "pUnk
>         Not used. Set to NULL."
>
> Setting that to NULL in amstream's BasePinImp_GetMediaType() fixes the
> crash for me. But who's responsibility is to set / check that? That
> function or the caller aka test_media_streams() ?
>
> bye
> 	michael
>
>
>
This is an helper function called by winestrmbase. It's internal. There 
is no need to do a null check.
The crash depends of the stack content.

AM_MEDIA_TYPE amt;
while (This->enumMediaFunction(This->basePin, i,&amt) == S_OK) i++;

Where supposed to fill all the structure fields. Off course we can make 
winestrmbase function zero it before calling the helper.

Here is the entire function

static HRESULT WINAPI IEnumMediaTypesImpl_Reset(IEnumMediaTypes * iface)
{
     ULONG i;
     AM_MEDIA_TYPE amt;
     IEnumMediaTypesImpl *This = impl_from_IEnumMediaTypes(iface);

     TRACE("()\n");

     for (i = 0; i < This->enumMediaDetails.cMediaTypes; i++)
         if (This->enumMediaDetails.pMediaTypes[i].pbFormat)
CoTaskMemFree(This->enumMediaDetails.pMediaTypes[i].pbFormat);
     CoTaskMemFree(This->enumMediaDetails.pMediaTypes);

     i = 0;
     while (This->enumMediaFunction(This->basePin, i,&amt) == S_OK) i++;

     This->enumMediaDetails.cMediaTypes = i;
     This->enumMediaDetails.pMediaTypes = 
CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * i);
     for (i = 0; i < This->enumMediaDetails.cMediaTypes; i++)
     {
         This->enumMediaFunction(This->basePin, i,&amt);
         if 
(FAILED(CopyMediaType(&This->enumMediaDetails.pMediaTypes[i], &amt)))
         {
            while (i--)
CoTaskMemFree(This->enumMediaDetails.pMediaTypes[i].pbFormat);
            CoTaskMemFree(This->enumMediaDetails.pMediaTypes);
            return E_OUTOFMEMORY;
         }
     }

     This->currentVersion = This->mediaVersionFunction(This->basePin);
     This->uIndex = 0;

     return S_OK;
}




More information about the wine-devel mailing list