Send LVN_DELETEITEM notification first, to avoid crashes if the app

requests LVIF_PARAM with LISTVIEW_GetItem() during its LVN_DELETEITEM
message handler.
oldstable
James Hatheway 2001-02-15 21:24:43 +00:00 committed by Alexandre Julliard
parent b9807b405e
commit a2c2a83f8e
1 changed files with 11 additions and 9 deletions

View File

@ -3930,6 +3930,17 @@ static LRESULT LISTVIEW_DeleteItem(HWND hwnd, INT nItem)
LVITEMA item;
TRACE("(hwnd=%x,nItem=%d)\n", hwnd, nItem);
/* First, send LVN_DELETEITEM notification. */
memset(&nmlv, 0, sizeof (NMLISTVIEW));
nmlv.hdr.hwndFrom = hwnd;
nmlv.hdr.idFrom = lCtrlId;
nmlv.hdr.code = LVN_DELETEITEM;
nmlv.iItem = nItem;
SendMessageA(GetParent(hwnd), WM_NOTIFY, (WPARAM)lCtrlId,
(LPARAM)&nmlv);
/* remove it from the selection range */
ZeroMemory(&item,sizeof(LVITEMA));
@ -3973,15 +3984,6 @@ static LRESULT LISTVIEW_DeleteItem(HWND hwnd, INT nItem)
lpItem = (LISTVIEW_ITEM *)DPA_GetPtr(hdpaSubItems, 0);
if (lpItem != NULL)
{
/* send LVN_DELETEITEM notification */
nmlv.hdr.hwndFrom = hwnd;
nmlv.hdr.idFrom = lCtrlId;
nmlv.hdr.code = LVN_DELETEITEM;
nmlv.iItem = nItem;
nmlv.lParam = lpItem->lParam;
SendMessageA(GetParent(hwnd), WM_NOTIFY, (WPARAM)lCtrlId,
(LPARAM)&nmlv);
/* free item string */
if ((lpItem->pszText != NULL) &&
(lpItem->pszText != LPSTR_TEXTCALLBACKA))