https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5c7a5786fd5e8ddbc9683fd29ec2c15a92966104

commit 5c7a5786fd5e8ddbc9683fd29ec2c15a92966104
Author:     Katayama Hirofumi MZ <[email protected]>
AuthorDate: Wed Sep 13 22:41:00 2023 +0900
Commit:     GitHub <[email protected]>
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)
     {

Reply via email to