From f836fe354bc556eabb1d696bc9376c91535695dc Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 2 Apr 2010 19:30:34 +0000 Subject: [PATCH 1/1] 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 --- src/msw/mediactrl_am.cpp | 45 ++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/msw/mediactrl_am.cpp b/src/msw/mediactrl_am.cpp index 66db8cf30a..dd80e3963d 100644 --- a/src/msw/mediactrl_am.cpp +++ b/src/msw/mediactrl_am.cpp @@ -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; } //--------------------------------------------------------------------------- -- 2.47.2