[SHELL32]
authorThomas Faber <thomas.faber@reactos.org>
Wed, 19 Aug 2015 11:45:21 +0000 (11:45 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Wed, 19 Aug 2015 11:45:21 +0000 (11:45 +0000)
- Correctly handle NULL callback in CMenuBand::GetMenuInfo
- Add missing error handling in CMenuFocusManager::UpdateFocus
Fixes crashes in shell32_apitest:menu
CORE-9932 #resolve

svn path=/trunk/; revision=68767

reactos/dll/win32/shell32/shellmenu/CMenuBand.cpp
reactos/dll/win32/shell32/shellmenu/CMenuFocusManager.cpp

index 5f8fc3b..323e9a6 100644 (file)
@@ -108,7 +108,8 @@ HRESULT STDMETHODCALLTYPE  CMenuBand::GetMenuInfo(
 
     if (ppsmc)
     {
-        m_psmc->AddRef();
+        if (m_psmc)
+            m_psmc->AddRef();
         *ppsmc = m_psmc;
     }
 
index 73b7721..4301f90 100644 (file)
@@ -814,14 +814,22 @@ HRESULT CMenuFocusManager::UpdateFocus()
             CComPtr<IServiceProvider> bandSite;
             CComPtr<IOleWindow> deskBar;
             hr = topMenu->mb->GetSite(IID_PPV_ARG(IServiceProvider, &bandSite));
+            if (FAILED(hr))
+                goto NoCapture;
             hr = bandSite->QueryService(SID_SMenuPopup, IID_PPV_ARG(IOleWindow, &deskBar));
+            if (FAILED(hr))
+                goto NoCapture;
 
             CComPtr<IOleWindow> deskBarSite;
             hr = IUnknown_GetSite(deskBar, IID_PPV_ARG(IOleWindow, &deskBarSite));
+            if (FAILED(hr))
+                goto NoCapture;
 
             // FIXME: Find the correct place for this
             HWND hWndOwner;
-            deskBarSite->GetWindow(&hWndOwner);
+            hr = deskBarSite->GetWindow(&hWndOwner);
+            if (FAILED(hr))
+                goto NoCapture;
 
             m_PreviousForeground = ::GetForegroundWindow();
             if (m_PreviousForeground != hWndOwner)
@@ -832,9 +840,11 @@ HRESULT CMenuFocusManager::UpdateFocus()
             // Get the HWND of the top-level window
             HWND hWndSite;
             hr = deskBar->GetWindow(&hWndSite);
+            if (FAILED(hr))
+                goto NoCapture;
             SetMenuCapture(hWndSite);
-
         }
+NoCapture:
 
         if (!m_parent || m_parent->type == MenuBarEntry)
         {