diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2023-02-17 16:20:49 +0100 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2023-02-17 16:20:49 +0100 |
commit | a0afeb5d5a9fd3cacdae827aa28904f16998be17 (patch) | |
tree | 3ba501fde6bec6173dfa63754e7f5a02f56730f5 /scene/gui | |
parent | 633d9e6327d6a6e0d45c5cc011ff813a37abc530 (diff) | |
parent | bcf3c81726455b3b27413c618b41df2bcdfe7fc2 (diff) |
Merge pull request #72184 from Maran23/item-list-index-out-of-bounds
ItemList: Check if the index is out bounds before accessing the internal items
Diffstat (limited to 'scene/gui')
-rw-r--r-- | scene/gui/item_list.cpp | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/scene/gui/item_list.cpp b/scene/gui/item_list.cpp index 25a27d5e1a..d367a8d281 100644 --- a/scene/gui/item_list.cpp +++ b/scene/gui/item_list.cpp @@ -801,8 +801,9 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) { search_string = ""; //any mousepress cancels for (int i = 4; i > 0; i--) { - if (current - current_columns * i >= 0 && CAN_SELECT(current - current_columns * i)) { - set_current(current - current_columns * i); + int index = current - current_columns * i; + if (index >= 0 && index < items.size() && CAN_SELECT(index)) { + set_current(index); ensure_current_is_visible(); if (select_mode == SELECT_SINGLE) { emit_signal(SNAME("item_selected"), current); @@ -815,8 +816,9 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) { search_string = ""; //any mousepress cancels for (int i = 4; i > 0; i--) { - if (current + current_columns * i < items.size() && CAN_SELECT(current + current_columns * i)) { - set_current(current + current_columns * i); + int index = current + current_columns * i; + if (index >= 0 && index < items.size() && CAN_SELECT(index)) { + set_current(index); ensure_current_is_visible(); if (select_mode == SELECT_SINGLE) { emit_signal(SNAME("item_selected"), current); @@ -832,7 +834,7 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) { if (current % current_columns != 0) { int current_row = current / current_columns; int next = current - 1; - while (!CAN_SELECT(next)) { + while (next >= 0 && !CAN_SELECT(next)) { next = next - 1; } if (next < 0 || !IS_SAME_ROW(next, current_row)) { @@ -852,7 +854,7 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) { if (current % current_columns != (current_columns - 1) && current + 1 < items.size()) { int current_row = current / current_columns; int next = current + 1; - while (!CAN_SELECT(next)) { + while (next < items.size() && !CAN_SELECT(next)) { next = next + 1; } if (items.size() <= next || !IS_SAME_ROW(next, current_row)) { |