From 6b0b1dc173c5b274b37e06d7508486cbc337d0c1 Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Thu, 17 Apr 2008 13:11:05 -0700 Subject: [PATCH] quartz: Fix sample leak in filesource on failure path --- dlls/quartz/filesource.c | 24 +++++++++++------------- 1 files changed, 11 insertions(+), 13 deletions(-) diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c index d31e150..8704b50 100644 --- a/dlls/quartz/filesource.c +++ b/dlls/quartz/filesource.c @@ -1125,30 +1125,28 @@ static HRESULT WINAPI FileAsyncReader_WaitForNext(IAsyncReader * iface, DWORD dw LeaveCriticalSection(&This->csList); } - if (SUCCEEDED(hr) && !This->bFlushing) + if (SUCCEEDED(hr)) { /* get any errors */ - if (!GetOverlappedResult(This->hFile, &pDataRq->ovl, &dwBytes, FALSE)) + if (!This->bFlushing && !GetOverlappedResult(This->hFile, &pDataRq->ovl, &dwBytes, FALSE)) hr = HRESULT_FROM_WIN32(GetLastError()); - } - if (SUCCEEDED(hr)) - { - IMediaSample_SetActualDataLength(pDataRq->pSample, dwBytes); + /* Return the sample no matter what so it can be destroyed */ *ppSample = pDataRq->pSample; *pdwUser = pDataRq->dwUserData; + + if (This->bFlushing) + { + hr = VFW_E_WRONG_STATE; + dwBytes = 0; + } + + IMediaSample_SetActualDataLength(pDataRq->pSample, dwBytes); } /* no need to close event handle since we will close it when the pin is destroyed */ CoTaskMemFree(pDataRq); - /* Return the sample if flushing so it can be destroyed */ - if (This->bFlushing && SUCCEEDED(hr)) - { - hr = VFW_E_WRONG_STATE; - IMediaSample_SetActualDataLength(pDataRq->pSample, 0); - } - TRACE("-- %x\n", hr); return hr; } -- 1.5.4.1