ChangeSet ID: 17319 CVSROOT: /opt/cvs-commit Module name: wine Changes by: julliard@wine.codeweavers.com 2005/05/06 09:34:03 Modified files: dlls/quartz : quartz_private.h enummedia.c Log message: Maarten Lankhorst Fixed {Copy/Delete/Free}MediaType functions to show proper behaviour. Fixed EnumMediaTypes to copy pbFormat too. Added FreeMediaType. Patch: http://cvs.winehq.org/patch.py?id=17319 Old revision New revision Changes Path 1.23 1.24 +1 -0 wine/dlls/quartz/quartz_private.h 1.5 1.6 +26 -6 wine/dlls/quartz/enummedia.c Index: wine/dlls/quartz/quartz_private.h diff -u -p wine/dlls/quartz/quartz_private.h:1.23 wine/dlls/quartz/quartz_private.h:1.24 --- wine/dlls/quartz/quartz_private.h:1.23 Thu May 23 01:42:39 2013 +++ wine/dlls/quartz/quartz_private.h Thu May 23 01:42:39 2013 @@ -77,6 +77,7 @@ extern const char * qzdebugstr_guid(cons extern const char * qzdebugstr_State(FILTER_STATE state); HRESULT CopyMediaType(AM_MEDIA_TYPE * pDest, const AM_MEDIA_TYPE *pSrc); +void FreeMediaType(AM_MEDIA_TYPE * pmt); void DeleteMediaType(AM_MEDIA_TYPE * pmt); BOOL CompareMediaTypes(const AM_MEDIA_TYPE * pmt1, const AM_MEDIA_TYPE * pmt2, BOOL bWildcards); void dump_AM_MEDIA_TYPE(const AM_MEDIA_TYPE * pmt); Index: wine/dlls/quartz/enummedia.c diff -u -p wine/dlls/quartz/enummedia.c:1.5 wine/dlls/quartz/enummedia.c:1.6 --- wine/dlls/quartz/enummedia.c:1.5 Thu May 23 01:42:39 2013 +++ wine/dlls/quartz/enummedia.c Thu May 23 01:42:39 2013 @@ -27,13 +27,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(quartz); HRESULT CopyMediaType(AM_MEDIA_TYPE * pDest, const AM_MEDIA_TYPE *pSrc) { memcpy(pDest, pSrc, sizeof(AM_MEDIA_TYPE)); + if (!pSrc->pbFormat) return S_OK; if (!(pDest->pbFormat = CoTaskMemAlloc(pSrc->cbFormat))) return E_OUTOFMEMORY; memcpy(pDest->pbFormat, pSrc->pbFormat, pSrc->cbFormat); return S_OK; } -void DeleteMediaType(AM_MEDIA_TYPE * pMediaType) +void FreeMediaType(AM_MEDIA_TYPE * pMediaType) { if (pMediaType->pbFormat) { @@ -47,6 +48,13 @@ void DeleteMediaType(AM_MEDIA_TYPE * pMe } } +void DeleteMediaType(AM_MEDIA_TYPE * pMediaType) +{ + FreeMediaType(pMediaType); + CoTaskMemFree(pMediaType); +} + + BOOL CompareMediaTypes(const AM_MEDIA_TYPE * pmt1, const AM_MEDIA_TYPE * pmt2, BOOL bWildcards) { TRACE("pmt1: "); @@ -90,7 +98,11 @@ HRESULT IEnumMediaTypesImpl_Construct(co pEnumMediaTypes->enumMediaDetails.cMediaTypes = pDetails->cMediaTypes; pEnumMediaTypes->enumMediaDetails.pMediaTypes = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * pDetails->cMediaTypes); for (i = 0; i < pDetails->cMediaTypes; i++) - pEnumMediaTypes->enumMediaDetails.pMediaTypes[i] = pDetails->pMediaTypes[i]; + if (FAILED(CopyMediaType(&pEnumMediaTypes->enumMediaDetails.pMediaTypes[i], &pDetails->pMediaTypes[i]))) { + while (--i > 0) CoTaskMemFree(pEnumMediaTypes->enumMediaDetails.pMediaTypes[i].pbFormat); + CoTaskMemFree(pEnumMediaTypes->enumMediaDetails.pMediaTypes); + return E_OUTOFMEMORY; + } *ppEnum = (IEnumMediaTypes *)(&pEnumMediaTypes->lpVtbl); return S_OK; } @@ -136,12 +148,14 @@ static ULONG WINAPI IEnumMediaTypesImpl_ if (!refCount) { + int i; + for (i = 0; i < This->enumMediaDetails.cMediaTypes; i++) + if (This->enumMediaDetails.pMediaTypes[i].pbFormat) + CoTaskMemFree(This->enumMediaDetails.pMediaTypes[i].pbFormat); CoTaskMemFree(This->enumMediaDetails.pMediaTypes); CoTaskMemFree(This); - return 0; } - else - return refCount; + return refCount; } static HRESULT WINAPI IEnumMediaTypesImpl_Next(IEnumMediaTypes * iface, ULONG cMediaTypes, AM_MEDIA_TYPE ** ppMediaTypes, ULONG * pcFetched) @@ -159,7 +173,13 @@ static HRESULT WINAPI IEnumMediaTypesImp ULONG i; *ppMediaTypes = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * cFetched); for (i = 0; i < cFetched; i++) - (*ppMediaTypes)[i] = This->enumMediaDetails.pMediaTypes[This->uIndex + i]; + if (FAILED(CopyMediaType(&(*ppMediaTypes)[i], &This->enumMediaDetails.pMediaTypes[This->uIndex + i]))) { + while (--i) + CoTaskMemFree((*ppMediaTypes)[i].pbFormat); + CoTaskMemFree(*ppMediaTypes); + *ppMediaTypes = NULL; + return E_OUTOFMEMORY; + } } if ((cMediaTypes != 1) || pcFetched)