Fix crash in wxMediaCtrl::GetDownloadProgress() with ActiveMovie backend.

IActiveMovie::get_FilterGraph() may return S_FALSE, i.e. succeed, while
leaving the output pointer NULL. Check for this and don't dereference the
pointer before checking for its validity.

Also do it for the other call in this function just in case. And rearrange the
code to be slightly more readable.

Closes #11894.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63831 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2010-04-02 19:30:34 +00:00
parent bd044e27b3
commit f836fe354b

View File

@ -2092,36 +2092,37 @@ void wxAMMediaBackend::DoGetDownloadProgress(wxLongLong* pLoadProgress,
wxLongLong* pLoadTotal)
{
#ifndef __WXWINCE__
LONGLONG loadTotal = 0, loadProgress = 0;
IUnknown* pFG;
IAMOpenProgress* pOP;
HRESULT hr;
hr = m_pAM->get_FilterGraph(&pFG);
if(SUCCEEDED(hr))
IUnknown* pFG = NULL;
HRESULT hr = m_pAM->get_FilterGraph(&pFG);
// notice that the call above may return S_FALSE and leave pFG NULL
if(SUCCEEDED(hr) && pFG)
{
IAMOpenProgress* pOP = NULL;
hr = pFG->QueryInterface(IID_IAMOpenProgress, (void**)&pOP);
if(SUCCEEDED(hr))
{
if(SUCCEEDED(hr) && pOP)
{
LONGLONG
loadTotal = 0,
loadProgress = 0;
hr = pOP->QueryProgress(&loadTotal, &loadProgress);
pOP->Release();
if(SUCCEEDED(hr))
{
*pLoadProgress = loadProgress;
*pLoadTotal = loadTotal;
pFG->Release();
return;
}
}
pFG->Release();
}
#endif // !__WXWINCE__
if(SUCCEEDED(hr))
{
*pLoadProgress = loadProgress;
*pLoadTotal = loadTotal;
}
else
#endif
{
// When not loading from a URL QueryProgress will return
// E_NOINTERFACE or whatever
// wxAMFAIL(hr);
*pLoadProgress = 0;
*pLoadTotal = 0;
}
*pLoadProgress = 0;
*pLoadTotal = 0;
}
//---------------------------------------------------------------------------