From: Thomas Faber Date: Tue, 29 Jul 2014 07:49:06 +0000 (+0000) Subject: [QUARTZ][STRMBASE] X-Git-Tag: backups/0.3.17@66124~872 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=da7e9b8445a60d2bcde5f386b7c4a8836363f685;ds=sidebyside [QUARTZ][STRMBASE] - 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 --- diff --git a/reactos/dll/directx/wine/quartz/enumfilters.c b/reactos/dll/directx/wine/quartz/enumfilters.c index c8efcc9ce87..5d13fa06c4f 100644 --- a/reactos/dll/directx/wine/quartz/enumfilters.c +++ b/reactos/dll/directx/wine/quartz/enumfilters.c @@ -113,6 +113,7 @@ static ULONG WINAPI IEnumFiltersImpl_Release(IEnumFilters * iface) if (!refCount) { IGraphVersion_Release(This->pVersionSource); + CoTaskMemFree(This); return 0; } else diff --git a/reactos/dll/directx/wine/quartz/filesource.c b/reactos/dll/directx/wine/quartz/filesource.c index e63a5f42cdc..46229cc6087 100644 --- a/reactos/dll/directx/wine/quartz/filesource.c +++ b/reactos/dll/directx/wine/quartz/filesource.c @@ -465,7 +465,7 @@ static HRESULT WINAPI AsyncReader_QueryInterface(IBaseFilter * iface, REFIID rii 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); @@ -485,6 +485,7 @@ static ULONG WINAPI AsyncReader_Release(IBaseFilter * iface) CoTaskMemFree(This->pszFileName); if (This->pmt) FreeMediaType(This->pmt); + BaseFilter_Destroy(&This->filter); CoTaskMemFree(This); return 0; } diff --git a/reactos/dll/directx/wine/quartz/nullrenderer.c b/reactos/dll/directx/wine/quartz/nullrenderer.c index b70c81df700..432749a976b 100644 --- a/reactos/dll/directx/wine/quartz/nullrenderer.c +++ b/reactos/dll/directx/wine/quartz/nullrenderer.c @@ -108,7 +108,7 @@ static ULONG WINAPI NullRendererInner_AddRef(IUnknown *iface) 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) { diff --git a/reactos/dll/directx/wine/quartz/parser.c b/reactos/dll/directx/wine/quartz/parser.c index 8476838984b..705c784577d 100644 --- a/reactos/dll/directx/wine/quartz/parser.c +++ b/reactos/dll/directx/wine/quartz/parser.c @@ -180,6 +180,7 @@ void Parser_Destroy(ParserImpl *This) } CoTaskMemFree(This->ppPins); + BaseFilter_Destroy(&This->filter); TRACE("Destroying parser\n"); CoTaskMemFree(This); @@ -188,7 +189,7 @@ void Parser_Destroy(ParserImpl *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); diff --git a/reactos/include/reactos/wine/strmbase.h b/reactos/include/reactos/wine/strmbase.h index 9727fb419e2..1370198d386 100644 --- a/reactos/include/reactos/wine/strmbase.h +++ b/reactos/include/reactos/wine/strmbase.h @@ -194,6 +194,7 @@ LONG WINAPI BaseFilterImpl_GetPinVersion(BaseFilter* This); 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); diff --git a/reactos/lib/3rdparty/strmbase/filter.c b/reactos/lib/3rdparty/strmbase/filter.c index 10d946034ba..09d3b5bd3d3 100644 --- a/reactos/lib/3rdparty/strmbase/filter.c +++ b/reactos/lib/3rdparty/strmbase/filter.c @@ -60,14 +60,7 @@ ULONG WINAPI BaseFilterImpl_Release(IBaseFilter * iface) 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; } @@ -209,3 +202,15 @@ HRESULT WINAPI BaseFilter_Init(BaseFilter * This, const IBaseFilterVtbl *Vtbl, c 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; +} diff --git a/reactos/lib/3rdparty/strmbase/renderer.c b/reactos/lib/3rdparty/strmbase/renderer.c index 433bcba730f..cf2f318244f 100644 --- a/reactos/lib/3rdparty/strmbase/renderer.c +++ b/reactos/lib/3rdparty/strmbase/renderer.c @@ -284,7 +284,7 @@ HRESULT WINAPI BaseRendererImpl_QueryInterface(IBaseFilter* iface, REFIID riid, 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) { @@ -309,6 +309,7 @@ ULONG WINAPI BaseRendererImpl_Release(IBaseFilter* iface) CloseHandle(This->ThreadSignal); CloseHandle(This->RenderEvent); QualityControlImpl_Destroy(This->qcimpl); + BaseFilter_Destroy(&This->filter); } return refCount; } diff --git a/reactos/lib/3rdparty/strmbase/transform.c b/reactos/lib/3rdparty/strmbase/transform.c index 8f5815a2bfd..dc59bb9f725 100644 --- a/reactos/lib/3rdparty/strmbase/transform.c +++ b/reactos/lib/3rdparty/strmbase/transform.c @@ -295,7 +295,7 @@ HRESULT WINAPI TransformFilterImpl_QueryInterface(IBaseFilter * iface, REFIID ri 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); @@ -325,6 +325,7 @@ ULONG WINAPI TransformFilterImpl_Release(IBaseFilter * iface) FreeMediaType(&This->pmt); QualityControlImpl_Destroy(This->qcimpl); IUnknown_Release(This->seekthru_unk); + BaseFilter_Destroy(&This->filter); CoTaskMemFree(This); return 0;