https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5c7a5786fd5e8ddbc9683f...
commit 5c7a5786fd5e8ddbc9683fd29ec2c15a92966104 Author: Katayama Hirofumi MZ katayama.hirofumi.mz@gmail.com AuthorDate: Wed Sep 13 22:41:00 2023 +0900 Commit: GitHub noreply@github.com CommitDate: Wed Sep 13 22:41:00 2023 +0900
[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<cItems; i++) @@ -904,6 +909,8 @@ int CDefView::LV_AddItem(PCUITEMID_CHILD pidl)
TRACE("(%p)(pidl=%p)\n", this, pidl);
+ ASSERT(m_ListView); + if (_DoFolderViewCB(SFVM_ADDINGOBJECT, 0, (LPARAM)pidl) == S_FALSE) return -1;
@@ -927,7 +934,11 @@ BOOLEAN CDefView::LV_DeleteItem(PCUITEMID_CHILD pidl)
TRACE("(%p)(pidl=%p)\n", this, pidl);
+ ASSERT(m_ListView); + nIndex = LV_FindItemByPidl(pidl); + if (nIndex < 0) + return FALSE;
return m_ListView.DeleteItem(nIndex); } @@ -942,6 +953,8 @@ BOOLEAN CDefView::LV_RenameItem(PCUITEMID_CHILD pidlOld, PCUITEMID_CHILD pidlNew
TRACE("(%p)(pidlold=%p pidlnew=%p)\n", this, pidlOld, pidlNew);
+ ASSERT(m_ListView); + nItem = LV_FindItemByPidl(pidlOld);
if ( -1 != nItem ) @@ -980,6 +993,8 @@ BOOLEAN CDefView::LV_ProdItem(PCUITEMID_CHILD pidl)
TRACE("(%p)(pidl=%p)\n", this, pidl);
+ ASSERT(m_ListView); + nItem = LV_FindItemByPidl(pidl);
if (-1 != nItem) @@ -1009,7 +1024,7 @@ INT CALLBACK CDefView::fill_list(LPVOID ptr, LPVOID arg) CDefView *pThis = static_cast<CDefView *>(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) {