From 9138fba9cf06cc1d50f8132dd87b98511cdab83b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Thu, 23 Jan 2025 11:00:30 +0200 Subject: [PATCH 1/3] Prevent out of bounds access, prevents assert on debug builds --- src/openrct2-ui/input/MouseInput.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openrct2-ui/input/MouseInput.cpp b/src/openrct2-ui/input/MouseInput.cpp index c6ad8aadb4..dec0c52356 100644 --- a/src/openrct2-ui/input/MouseInput.cpp +++ b/src/openrct2-ui/input/MouseInput.cpp @@ -961,7 +961,7 @@ namespace OpenRCT2 { windowClass = w->classification; windowNumber = w->number; - widget = &w->widgets[widgetIndex]; + widget = widgetIndex == kWidgetIndexNull ? nullptr : &w->widgets[widgetIndex]; } InputWidgetOverChangeCheck(windowClass, windowNumber, widgetIndex); From e17799fb68adf029edd41a0f496c301a13807743 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Thu, 23 Jan 2025 11:01:43 +0200 Subject: [PATCH 2/3] Fix #23686: Shortcut window crashing and missing widgets --- src/openrct2-ui/windows/ShortcutKeys.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/openrct2-ui/windows/ShortcutKeys.cpp b/src/openrct2-ui/windows/ShortcutKeys.cpp index d59175955f..889c46f311 100644 --- a/src/openrct2-ui/windows/ShortcutKeys.cpp +++ b/src/openrct2-ui/windows/ShortcutKeys.cpp @@ -248,7 +248,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_SCROLL].bottom = height - 19; widgets[WIDX_RESET].top = height - 16; widgets[WIDX_RESET].bottom = height - 5; - WindowAlignTabs(this, WIDX_TAB_0, static_cast(WIDX_TAB_0 + _tabs.size())); + WindowAlignTabs(this, WIDX_TAB_0, static_cast(WIDX_TAB_0 + _tabs.size() - 1)); // Set selected tab for (size_t i = 0; i < _tabs.size(); i++) @@ -450,7 +450,7 @@ namespace OpenRCT2::Ui::Windows void InitialiseWidgets() { widgets.clear(); - widgets.insert(widgets.begin(), std::begin(_shortcutWidgets), std::end(_shortcutWidgets) - 1); + widgets.insert(widgets.begin(), std::begin(_shortcutWidgets), std::end(_shortcutWidgets)); int32_t x = 3; for (size_t i = 0; i < _tabs.size(); i++) From fe950f75d18e61d3e13ba2b5a69114cdfe824d6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Thu, 23 Jan 2025 11:05:20 +0200 Subject: [PATCH 3/3] Add some assertions --- src/openrct2-ui/interface/Window.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/openrct2-ui/interface/Window.cpp b/src/openrct2-ui/interface/Window.cpp index def4b4e0e0..c33d09c663 100644 --- a/src/openrct2-ui/interface/Window.cpp +++ b/src/openrct2-ui/interface/Window.cpp @@ -527,12 +527,17 @@ namespace OpenRCT2 void WindowAlignTabs(WindowBase* w, WidgetIndex start_tab_id, WidgetIndex end_tab_id) { + assert(start_tab_id < w->widgets.size()); + assert(end_tab_id < w->widgets.size()); + int32_t i, x = w->widgets[start_tab_id].left; int32_t tab_width = w->widgets[start_tab_id].width(); for (i = start_tab_id; i <= end_tab_id; i++) { auto& widget = w->widgets[i]; + assert(widget.type == WindowWidgetType::Tab); + if (!WidgetIsDisabled(*w, i)) { widget.left = x;