Fixed qcap's inherited enummedia bugs.
diff --git a/dlls/qcap/enummedia.c b/dlls/qcap/enummedia.c
index 87d4e96..579f2a1 100644
--- a/dlls/qcap/enummedia.c
+++ b/dlls/qcap/enummedia.c
@@ -38,13 +38,14 @@
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)
{
@@ -58,6 +59,12 @@
}
}
+void DeleteMediaType(AM_MEDIA_TYPE * pMediaType)
+{
+ FreeMediaType(pMediaType);
+ CoTaskMemFree(pMediaType);
+}
+
BOOL CompareMediaTypes(const AM_MEDIA_TYPE * pmt1, const AM_MEDIA_TYPE * pmt2,
BOOL bWildcards)
{
@@ -110,7 +117,11 @@
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--) CoTaskMemFree(pEnumMediaTypes->enumMediaDetails.pMediaTypes[i].pbFormat);
+ CoTaskMemFree(pEnumMediaTypes->enumMediaDetails.pMediaTypes);
+ return E_OUTOFMEMORY;
+ }
*ppEnum = (IEnumMediaTypes *)(&pEnumMediaTypes->lpVtbl);
return S_OK;
}
@@ -158,13 +169,15 @@
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);
ObjectRefCount(FALSE);
- return 0;
}
- else
- return refCount;
+ return refCount;
}
static HRESULT WINAPI IEnumMediaTypesImpl_Next(IEnumMediaTypes * iface,
@@ -186,7 +199,13 @@
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)