Joachim Priesner : comctl32: Treeview: Fix crash when deleting the first visible item while bRedraw == false.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Feb 1 09:24:45 CST 2016
Module: wine
Branch: master
Commit: 4c799937f6a964612fce90d9492c5c2d5d2516e1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4c799937f6a964612fce90d9492c5c2d5d2516e1
Author: Joachim Priesner <joachim.priesner at web.de>
Date: Sun Jan 31 18:52:07 2016 +0100
comctl32: Treeview: Fix crash when deleting the first visible item while bRedraw == false.
Signed-off-by: Joachim Priesner <joachim.priesner at web.de>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/comctl32/tests/treeview.c | 33 +++++++++++++++++++++++++++++++++
dlls/comctl32/treeview.c | 4 +++-
2 files changed, 36 insertions(+), 1 deletion(-)
diff --git a/dlls/comctl32/tests/treeview.c b/dlls/comctl32/tests/treeview.c
index 92504c1..bd030d6 100644
--- a/dlls/comctl32/tests/treeview.c
+++ b/dlls/comctl32/tests/treeview.c
@@ -1878,8 +1878,13 @@ static void test_delete_items(void)
{
const struct message *msg;
HWND hTree;
+ HTREEITEM hItem1, hItem2;
+ TVINSERTSTRUCTA ins;
INT ret;
+ static CHAR item1[] = "Item 1";
+ static CHAR item2[] = "Item 2";
+
hTree = create_treeview_control(0);
fill_tree(hTree);
@@ -1901,6 +1906,34 @@ static void test_delete_items(void)
ok(ret == 0, "got %d\n", ret);
DestroyWindow(hTree);
+
+ /* Regression test for a crash when deleting the first visible item while bRedraw == false. */
+ hTree = create_treeview_control(0);
+
+ ins.hParent = TVI_ROOT;
+ ins.hInsertAfter = TVI_ROOT;
+ U(ins).item.mask = TVIF_TEXT;
+ U(ins).item.pszText = item1;
+ hItem1 = TreeView_InsertItemA(hTree, &ins);
+ ok(hItem1 != NULL, "InsertItem failed\n");
+
+ ins.hParent = TVI_ROOT;
+ ins.hInsertAfter = hItem1;
+ U(ins).item.mask = TVIF_TEXT;
+ U(ins).item.pszText = item2;
+ hItem2 = TreeView_InsertItemA(hTree, &ins);
+ ok(hItem2 != NULL, "InsertItem failed\n");
+
+ ret = SendMessageA(hTree, WM_SETREDRAW, FALSE, 0);
+ ok(ret == 0, "got %d\n", ret);
+
+ ret = SendMessageA(hTree, TVM_DELETEITEM, 0, (LPARAM)hItem1);
+ ok(ret == TRUE, "got %d\n", ret);
+
+ ret = SendMessageA(hTree, WM_SETREDRAW, TRUE, 0);
+ ok(ret == 0, "got %d\n", ret);
+
+ DestroyWindow(hTree);
}
static void test_cchildren(void)
diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c
index e0e9945..5938b29 100644
--- a/dlls/comctl32/treeview.c
+++ b/dlls/comctl32/treeview.c
@@ -1580,11 +1580,13 @@ TREEVIEW_DeleteItem(TREEVIEW_INFO *infoPtr, HTREEITEM item)
TREEVIEW_VerifyTree(infoPtr);
+ if (visible)
+ TREEVIEW_SetFirstVisible(infoPtr, newFirstVisible, TRUE);
+
if (!infoPtr->bRedraw) return TRUE;
if (visible)
{
- TREEVIEW_SetFirstVisible(infoPtr, newFirstVisible, TRUE);
TREEVIEW_RecalculateVisibleOrder(infoPtr, prev);
TREEVIEW_UpdateScrollBars(infoPtr);
TREEVIEW_Invalidate(infoPtr, NULL);
More information about the wine-cvs
mailing list