From 5c7a5786fd5e8ddbc9683fd29ec2c15a92966104 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Wed, 13 Sep 2023 22:41:00 +0900 Subject: [PATCH] [SHELL32] Check m_ListView on some methods (#5684) - comdlg32:filedlg could encounter an assertion error in CWindow::SendMessage. - Assert the existence of the listview control m_ListView in the CDefView::LV_... function. - Actually check the existence of m_ListView outside the CDefView::LV_... function. ROSTESTS-388 --- dll/win32/shell32/CDefView.cpp | 58 ++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/dll/win32/shell32/CDefView.cpp b/dll/win32/shell32/CDefView.cpp index ebcfa767090..9f12fd09549 100644 --- a/dll/win32/shell32/CDefView.cpp +++ b/dll/win32/shell32/CDefView.cpp @@ -545,6 +545,9 @@ void CDefView::UpdateStatusbar() WCHAR szPartText[MAX_PATH] = {0}; UINT cSelectedItems; + if (!m_ListView) + return; + cSelectedItems = m_ListView.GetSelectedCount(); if (cSelectedItems) { @@ -884,6 +887,8 @@ PCUITEMID_CHILD CDefView::_PidlByItem(LVITEM& lvItem) */ int CDefView::LV_FindItemByPidl(PCUITEMID_CHILD pidl) { + ASSERT(m_ListView); + int cItems = m_ListView.GetItemCount(); for (int i = 0; i(arg); /* in a commdlg This works as a filemask*/ - if (pThis->IncludeObject(pidl) == S_OK) + if (pThis->IncludeObject(pidl) == S_OK && pThis->m_ListView) pThis->LV_AddItem(pidl); SHFree(pidl); @@ -1482,6 +1497,8 @@ UINT CDefView::GetSelections() TRACE("-- Items selected =%u\n", m_cidl); + ASSERT(m_ListView); + UINT i = 0; int lvIndex = -1; while ((lvIndex = m_ListView.GetNextItem(lvIndex, LVNI_SELECTED)) > -1) @@ -1734,11 +1751,12 @@ LRESULT CDefView::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled TRACE("%p width=%u height=%u\n", this, wWidth, wHeight); + // WM_SIZE can come before WM_CREATE + if (!m_ListView) + return 0; + /* Resize the ListView to fit our window */ - if (m_ListView) - { - ::MoveWindow(m_ListView, 0, 0, wWidth, wHeight, TRUE); - } + ::MoveWindow(m_ListView, 0, 0, wWidth, wHeight, TRUE); _DoFolderViewCB(SFVM_SIZE, 0, 0); @@ -2313,6 +2331,10 @@ static BOOL ILIsParentOrSpecialParent(PCIDLIST_ABSOLUTE pidl1, PCIDLIST_ABSOLUTE */ LRESULT CDefView::OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) { + // The change notify can come before WM_CREATE. + if (!m_ListView) + return FALSE; + HANDLE hChange = (HANDLE)wParam; DWORD dwProcID = (DWORD)lParam; PIDLIST_ABSOLUTE *Pidls; @@ -2658,6 +2680,12 @@ HRESULT WINAPI CDefView::SelectItem(PCUITEMID_CHILD pidl, UINT uFlags) TRACE("(%p)->(pidl=%p, 0x%08x) stub\n", this, pidl, uFlags); + if (!m_ListView) + { + ERR("!m_ListView\n"); + return E_FAIL; + } + i = LV_FindItemByPidl(pidl); if (i == -1) return S_OK; @@ -2866,6 +2894,12 @@ HRESULT STDMETHODCALLTYPE CDefView::GetFocusedItem(int *piItem) HRESULT STDMETHODCALLTYPE CDefView::GetItemPosition(PCUITEMID_CHILD pidl, POINT *ppt) { + if (!m_ListView) + { + ERR("!m_ListView\n"); + return E_FAIL; + } + int lvIndex = LV_FindItemByPidl(pidl); if (lvIndex == -1 || ppt == NULL) return E_INVALIDARG; @@ -2879,7 +2913,10 @@ HRESULT STDMETHODCALLTYPE CDefView::GetSpacing(POINT *ppt) TRACE("(%p)->(%p)\n", this, ppt); if (!m_ListView) + { + ERR("!m_ListView\n"); return S_FALSE; + } if (ppt) { @@ -2942,6 +2979,8 @@ HRESULT STDMETHODCALLTYPE CDefView::SelectItem(int iItem, DWORD dwFlags) HRESULT STDMETHODCALLTYPE CDefView::SelectAndPositionItems(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, POINT *apt, DWORD dwFlags) { + ASSERT(m_ListView); + /* Reset the selection */ m_ListView.SetItemState(-1, 0, LVIS_SELECTED); @@ -3099,6 +3138,11 @@ HRESULT STDMETHODCALLTYPE CDefView::AutoArrange() HRESULT STDMETHODCALLTYPE CDefView::AddObject(PITEMID_CHILD pidl, UINT *item) { TRACE("(%p)->(%p %p)\n", this, pidl, item); + if (!m_ListView) + { + ERR("!m_ListView\n"); + return E_FAIL; + } *item = LV_AddItem(pidl); return (int)*item >= 0 ? S_OK : E_OUTOFMEMORY; } @@ -3111,11 +3155,13 @@ HRESULT STDMETHODCALLTYPE CDefView::GetObject(PITEMID_CHILD *pidl, UINT item) HRESULT STDMETHODCALLTYPE CDefView::RemoveObject(PITEMID_CHILD pidl, UINT *item) { - TRACE("(%p)->(%p %p)\n", this, pidl, item); if (!m_ListView) + { + ERR("!m_ListView\n"); return E_FAIL; + } if (pidl) {