[PATCH 1/3] comctl32/listview: Filter invalid indices when setting selection mark
Nikolay Sivov
nsivov at codeweavers.com
Mon Aug 1 04:18:50 CDT 2016
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/comctl32/listview.c | 3 ++-
dlls/comctl32/tests/listview.c | 24 +++++++++++++++++++++++-
2 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index cfdb7de..a32c594 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -9053,7 +9053,8 @@ static INT LISTVIEW_SetSelectionMark(LISTVIEW_INFO *infoPtr, INT nIndex)
TRACE("(nIndex=%d)\n", nIndex);
- infoPtr->nSelectionMark = nIndex;
+ if (nIndex >= -1 && nIndex < infoPtr->nItemCount)
+ infoPtr->nSelectionMark = nIndex;
return nOldIndex;
}
diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c
index 1444a9f..86070be 100644
--- a/dlls/comctl32/tests/listview.c
+++ b/dlls/comctl32/tests/listview.c
@@ -2259,7 +2259,29 @@ static void test_multiselect(void)
item_count = SendMessageA(hwnd, LVM_GETITEMCOUNT, 0, 0);
expect(items, item_count);
- for (i = 0; i < 4; i++) {
+ r = SendMessageA(hwnd, LVM_SETSELECTIONMARK, 0, -1);
+ ok(r == -1, "got %d\n", r);
+
+ r = SendMessageA(hwnd, LVM_SETSELECTIONMARK, 0, 0);
+ ok(r == -1, "got %d\n", r);
+
+ r = SendMessageA(hwnd, LVM_SETSELECTIONMARK, 0, 0);
+ ok(r == 0, "got %d\n", r);
+
+ /* out of range index */
+ r = SendMessageA(hwnd, LVM_SETSELECTIONMARK, 0, items);
+ ok(r == 0, "got %d\n", r);
+
+ r = SendMessageA(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+ ok(r == 0, "got %d\n", r);
+
+ r = SendMessageA(hwnd, LVM_SETSELECTIONMARK, 0, -2);
+ ok(r == 0, "got %d\n", r);
+
+ r = SendMessageA(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+ ok(r == 0, "got %d\n", r);
+
+ for (i = 0; i < sizeof(task_list)/sizeof(task_list[0]); i++) {
DWORD selected_count;
LVITEMA item;
--
2.8.1
More information about the wine-patches
mailing list