From 4c799937f6a964612fce90d9492c5c2d5d2516e1 Mon Sep 17 00:00:00 2001 From: Joachim Priesner Date: Sun, 31 Jan 2016 18:52:07 +0100 Subject: [PATCH] comctl32: Treeview: Fix crash when deleting the first visible item while bRedraw == false. Signed-off-by: Joachim Priesner Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- 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 92504c1182..bd030d6781 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 e0e9945f3b..5938b29ebc 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); -- 2.33.8