]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix crash in wxMediaCtrl::GetDownloadProgress() with ActiveMovie backend.
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 2 Apr 2010 19:30:34 +0000 (19:30 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 2 Apr 2010 19:30:34 +0000 (19:30 +0000)
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

index 66db8cf30a883074eeb69725a0b3f40d17461960..dd80e3963dbe98a062b176d3b8ba0221f0e040f9 100644 (file)
@@ -2092,36 +2092,37 @@ void wxAMMediaBackend::DoGetDownloadProgress(wxLongLong* pLoadProgress,
                                              wxLongLong* pLoadTotal)
 {
 #ifndef __WXWINCE__
                                              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);
         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();
             hr = pOP->QueryProgress(&loadTotal, &loadProgress);
             pOP->Release();
+
+            if(SUCCEEDED(hr))
+            {
+                *pLoadProgress = loadProgress;
+                *pLoadTotal = loadTotal;
+                pFG->Release();
+                return;
+            }
         }
         pFG->Release();
     }
         }
         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;
 }
 
 //---------------------------------------------------------------------------
 }
 
 //---------------------------------------------------------------------------