https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5c7a5786fd5e8ddbc9683…
commit 5c7a5786fd5e8ddbc9683fd29ec2c15a92966104
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Wed Sep 13 22:41:00 2023 +0900
Commit: GitHub <noreply(a)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)
{