- Fix use-after-free on critical sections, which caused test hangs. Also fix some memory leaks. More fixes coming with the next Wine-sync, but this should be enough to get tests working.
ROSTESTS-116
svn path=/trunk/; revision=63757
if (!refCount)
{
IGraphVersion_Release(This->pVersionSource);
+ CoTaskMemFree(This);
return 0;
}
else
static ULONG WINAPI AsyncReader_Release(IBaseFilter * iface)
{
AsyncReader *This = impl_from_IBaseFilter(iface);
- ULONG refCount = BaseFilterImpl_Release(iface);
+ ULONG refCount = InterlockedDecrement(&This->filter.refCount);
TRACE("(%p)->() Release from %d\n", This, refCount + 1);
CoTaskMemFree(This->pszFileName);
if (This->pmt)
FreeMediaType(This->pmt);
+ BaseFilter_Destroy(&This->filter);
CoTaskMemFree(This);
return 0;
}
static ULONG WINAPI NullRendererInner_Release(IUnknown *iface)
{
NullRendererImpl *This = impl_from_IUnknown(iface);
- ULONG refCount = BaseFilterImpl_Release(&This->renderer.filter.IBaseFilter_iface);
+ ULONG refCount = BaseRendererImpl_Release(&This->renderer.filter.IBaseFilter_iface);
if (!refCount)
{
}
CoTaskMemFree(This->ppPins);
+ BaseFilter_Destroy(&This->filter);
TRACE("Destroying parser\n");
CoTaskMemFree(This);
ULONG WINAPI Parser_Release(IBaseFilter * iface)
{
ParserImpl *This = impl_from_IBaseFilter(iface);
- ULONG refCount = BaseFilterImpl_Release(iface);
+ ULONG refCount = InterlockedDecrement(&This->filter.refCount);
TRACE("(%p)->() Release from %d\n", This, refCount + 1);
VOID WINAPI BaseFilterImpl_IncrementPinVersion(BaseFilter* This);
HRESULT WINAPI BaseFilter_Init(BaseFilter * This, const IBaseFilterVtbl *Vtbl, const CLSID *pClsid, DWORD_PTR DebugInfo, const BaseFilterFuncTable* pBaseFuncsTable);
+HRESULT WINAPI BaseFilter_Destroy(BaseFilter * This);
/* Enums */
HRESULT WINAPI EnumMediaTypes_Construct(BasePin *iface, BasePin_GetMediaType enumFunc, BasePin_GetMediaTypeVersion versionFunc, IEnumMediaTypes ** ppEnum);
TRACE("(%p)->() Release from %d\n", This, refCount + 1);
if (!refCount)
- {
- if (This->pClock)
- IReferenceClock_Release(This->pClock);
-
- This->IBaseFilter_iface.lpVtbl = NULL;
- This->csFilter.DebugInfo->Spare[0] = 0;
- DeleteCriticalSection(&This->csFilter);
- }
+ BaseFilter_Destroy(This);
return refCount;
}
return S_OK;
}
+
+HRESULT WINAPI BaseFilter_Destroy(BaseFilter * This)
+{
+ if (This->pClock)
+ IReferenceClock_Release(This->pClock);
+
+ This->IBaseFilter_iface.lpVtbl = NULL;
+ This->csFilter.DebugInfo->Spare[0] = 0;
+ DeleteCriticalSection(&This->csFilter);
+
+ return S_OK;
+}
ULONG WINAPI BaseRendererImpl_Release(IBaseFilter* iface)
{
BaseRenderer *This = impl_from_IBaseFilter(iface);
- ULONG refCount = BaseFilterImpl_Release(iface);
+ ULONG refCount = InterlockedDecrement(&This->filter.refCount);
if (!refCount)
{
CloseHandle(This->ThreadSignal);
CloseHandle(This->RenderEvent);
QualityControlImpl_Destroy(This->qcimpl);
+ BaseFilter_Destroy(&This->filter);
}
return refCount;
}
ULONG WINAPI TransformFilterImpl_Release(IBaseFilter * iface)
{
TransformFilter *This = impl_from_IBaseFilter(iface);
- ULONG refCount = BaseFilterImpl_Release(iface);
+ ULONG refCount = InterlockedDecrement(&This->filter.refCount);
TRACE("(%p/%p)->() Release from %d\n", This, iface, refCount + 1);
FreeMediaType(&This->pmt);
QualityControlImpl_Destroy(This->qcimpl);
IUnknown_Release(This->seekthru_unk);
+ BaseFilter_Destroy(&This->filter);
CoTaskMemFree(This);
return 0;