EnumMedia patch

Maarten Lankhorst m.b.lankhorst at gmail.com
Fri Apr 29 10:00:13 CDT 2005


This patch fixes AM_MEDIA_TYPE->pbFormat not being handled correctly, 
unfortunately, this also means some stuff has to be rewritten to avoid 
memleaks, instead of CoTaskMemFree(AM_MEDIA_TYPE), DeleteMediaType has 
to be used.. This also fixes the errors i had with msn webcam, i feel 
like i stumbled over every bug in quartz now......
-------------- next part --------------
Index: ./dlls/quartz/enummedia.c
===================================================================
RCS file: /home/wine/wine/dlls/quartz/enummedia.c,v
retrieving revision 1.5
diff -u -p -r1.5 enummedia.c
--- ./dlls/quartz/enummedia.c	6 Jan 2005 19:36:47 -0000	1.5
+++ ./dlls/quartz/enummedia.c	29 Apr 2005 14:59:08 -0000
@@ -27,6 +27,7 @@ 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);
@@ -45,6 +46,7 @@ void DeleteMediaType(AM_MEDIA_TYPE * pMe
         IUnknown_Release(pMediaType->pUnk);
         pMediaType->pUnk = NULL;
     }
+    CoTaskMemFree(pMediaType);
 }
 
 BOOL CompareMediaTypes(const AM_MEDIA_TYPE * pmt1, const AM_MEDIA_TYPE * pmt2, BOOL bWildcards)
@@ -90,7 +92,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 +142,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 +167,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)


More information about the wine-patches mailing list