comctl32: treeview: Fix crash when deleting the first visible item while bRedraw == false
Nikolay Sivov
nsivov at codeweavers.com
Sun Jan 31 11:24:05 CST 2016
On 01/30/2016 12:11 AM, Joachim Priesner wrote:
> 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)
Please append new tests to test_delete_items(), after a comment line
describing what's being tested.
> +{
> + 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);
Just to make sure add a test for hItem != NULL.
> +
> + 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 */
> +
Same here, it'll also make a value used.
> + 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);
> +
For WM_SETREDRAW wParam please use TRUE/FALSE instead.
Otherwise looks good, thanks for fixing this.
More information about the wine-devel
mailing list