comctl32: treeview: Fix crash when deleting the first visible item while bRedraw == false
Joachim Priesner
joachim.priesner at web.de
Fri Jan 29 15:11:01 CST 2016
When bRedraw == false, TREEVIEW_DeleteItem returned early, leaving
firstVisible == NULL. This led to a crash when bRedraw was set to true
again.
Signed-off-by: Joachim Priesner <joachim.priesner at web.de>
---
dlls/comctl32/tests/treeview.c | 38 ++++++++++++++++++++++++++++++++++++++
dlls/comctl32/treeview.c | 4 +++-
2 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/dlls/comctl32/tests/treeview.c b/dlls/comctl32/tests/treeview.c
index 92504c1..34d0674 100644
--- a/dlls/comctl32/tests/treeview.c
+++ b/dlls/comctl32/tests/treeview.c
@@ -1903,6 +1903,43 @@ static void test_delete_items(void)
DestroyWindow(hTree);
}
+static void test_delete_first_visible_setredraw_false(void)
+{
+ HWND hTree;
+ INT ret;
+ TVINSERTSTRUCTA ins;
+ HTREEITEM hItem1;
+
+ static CHAR item1[] = "Item 1";
+ static CHAR item2[] = "Item 2";
+
+ 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);
+
+ ins.hParent = TVI_ROOT;
+ ins.hInsertAfter = hItem1;
+ U(ins).item.mask = TVIF_TEXT;
+ U(ins).item.pszText = item2;
+ (void*) TreeView_InsertItemA(hTree, &ins); /* return value unused */
+
+ ret = SendMessageA(hTree, WM_SETREDRAW, 0, 0);
+ ok(ret == 0, "got %d\n", ret);
+
+ ret = SendMessageA(hTree, TVM_DELETEITEM, 0, (LPARAM)hItem1);
+ ok(ret == TRUE, "got %d\n", ret);
+
+ /* this used to crash, test that it does not any more */
+ ret = SendMessageA(hTree, WM_SETREDRAW, 1, 0);
+ ok(ret == 0, "got %d\n", ret);
+
+ DestroyWindow(hTree);
+}
+
static void test_cchildren(void)
{
HWND hTree;
@@ -2403,6 +2440,7 @@ START_TEST(treeview)
test_TVS_SINGLEEXPAND();
test_WM_PAINT();
test_delete_items();
+ test_delete_first_visible_setredraw_false();
test_cchildren();
test_htreeitem_layout();
test_TVS_CHECKBOXES();
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);
--
2.1.4
More information about the wine-patches
mailing list