From c4502df947b044739c9c20ffdf8f9f41c9830f25 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 12 May 2020 18:53:37 +0100 Subject: [PATCH 1/3] Fix #11731: invalid read in ScWindow::x_get --- src/openrct2-ui/scripting/ScWindow.hpp | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/openrct2-ui/scripting/ScWindow.hpp b/src/openrct2-ui/scripting/ScWindow.hpp index 106b82281b..c3380c3db9 100644 --- a/src/openrct2-ui/scripting/ScWindow.hpp +++ b/src/openrct2-ui/scripting/ScWindow.hpp @@ -53,21 +53,37 @@ namespace OpenRCT2::Scripting int32_t x_get() const { - return GetWindow()->windowPos.x; + auto w = GetWindow(); + if (w != nullptr) + { + return w->windowPos.x; + } + return 0; } void x_set(int32_t value) { auto w = GetWindow(); - window_set_position(w, { value, w->windowPos.y }); + if (w != nullptr) + { + window_set_position(w, { value, w->windowPos.y }); + } } int32_t y_get() const { - return GetWindow()->windowPos.y; + auto w = GetWindow(); + if (w != nullptr) + { + return w->windowPos.y; + } + return 0; } void y_set(int32_t value) { auto w = GetWindow(); - window_set_position(w, { w->windowPos.x, value }); + if (w != nullptr) + { + window_set_position(w, { w->windowPos.x, value }); + } } int32_t width_get() const { From 86fa2f37147d68b569d1180cd3630ca1e62a3178 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 12 May 2020 18:54:00 +0100 Subject: [PATCH 2/3] Fix #11730: invalid write in CustomListView::SortItems --- src/openrct2-ui/scripting/CustomListView.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/openrct2-ui/scripting/CustomListView.cpp b/src/openrct2-ui/scripting/CustomListView.cpp index 397b6a1d44..6b6684cb54 100644 --- a/src/openrct2-ui/scripting/CustomListView.cpp +++ b/src/openrct2-ui/scripting/CustomListView.cpp @@ -317,7 +317,10 @@ void CustomListView::SortItems(int32_t column, ColumnSortOrder order) CurrentSortOrder = order; CurrentSortColumn = column; - Columns[column].SortOrder = order; + if (column >= 0 && static_cast(column) < Columns.size()) + { + Columns[column].SortOrder = order; + } } void CustomListView::Resize(const ScreenSize& size) From b3c4dd4844968fdaf88ecb83a3142f0b03752185 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 12 May 2020 21:03:21 +0100 Subject: [PATCH 3/3] Fix invalidation of list view widget --- src/openrct2-ui/scripting/CustomListView.cpp | 29 ++++++++++++++++++-- src/openrct2-ui/scripting/CustomListView.h | 1 + 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/openrct2-ui/scripting/CustomListView.cpp b/src/openrct2-ui/scripting/CustomListView.cpp index 6b6684cb54..c2efda6450 100644 --- a/src/openrct2-ui/scripting/CustomListView.cpp +++ b/src/openrct2-ui/scripting/CustomListView.cpp @@ -232,6 +232,7 @@ void CustomListView::SetScrollbars(ScrollbarType value, bool initialising) } } window_init_scroll_widgets(ParentWindow); + Invalidate(); } } @@ -247,7 +248,10 @@ void CustomListView::SetColumns(const std::vector& columns, bool LastKnownSize = {}; SortItems(0, ColumnSortOrder::None); if (!initialising) + { window_init_scroll_widgets(ParentWindow); + Invalidate(); + } } const std::vector& CustomListView::CustomListView::GetItems() const @@ -261,7 +265,10 @@ void CustomListView::SetItems(const std::vector& items, bool initi Items = items; SortItems(0, ColumnSortOrder::None); if (!initialising) + { window_update_scroll_widgets(ParentWindow); + Invalidate(); + } } void CustomListView::SetItems(std::vector&& items, bool initialising) @@ -269,7 +276,10 @@ void CustomListView::SetItems(std::vector&& items, bool initialisi Items = items; SortItems(0, ColumnSortOrder::None); if (!initialising) + { window_init_scroll_widgets(ParentWindow); + Invalidate(); + } } bool CustomListView::SortItem(size_t indexA, size_t indexB, int32_t column) @@ -321,6 +331,7 @@ void CustomListView::SortItems(int32_t column, ColumnSortOrder order) { Columns[column].SortOrder = order; } + Invalidate(); } void CustomListView::Resize(const ScreenSize& size) @@ -379,6 +390,7 @@ void CustomListView::Resize(const ScreenSize& size) } window_init_scroll_widgets(ParentWindow); + Invalidate(); } ScreenSize CustomListView::GetSize() @@ -423,6 +435,7 @@ void CustomListView::MouseOver(const ScreenCoordsXY& pos, bool isMouseDown) auto& scriptEngine = GetContext()->GetScriptEngine(); scriptEngine.ExecutePluginCall(Owner, OnHighlight, { dukRow, dukColumn }, false); } + Invalidate(); } } @@ -432,6 +445,7 @@ void CustomListView::MouseOver(const ScreenCoordsXY& pos, bool isMouseDown) if (hitResult && hitResult->Row == HEADER_ROW) { ColumnHeaderPressedCurrentState = (hitResult->Column == ColumnHeaderPressed); + Invalidate(); } IsMouseDown = true; } @@ -455,6 +469,7 @@ void CustomListView::MouseDown(const ScreenCoordsXY& pos) if (CanSelect) { SelectedCell = hitResult; + Invalidate(); } auto ctx = OnClick.context(); @@ -472,6 +487,7 @@ void CustomListView::MouseDown(const ScreenCoordsXY& pos) { ColumnHeaderPressed = hitResult->Column; ColumnHeaderPressedCurrentState = true; + Invalidate(); } } IsMouseDown = true; @@ -488,8 +504,12 @@ void CustomListView::MouseUp(const ScreenCoordsXY& pos) } } - ColumnHeaderPressed = std::nullopt; - ColumnHeaderPressedCurrentState = false; + if (!ColumnHeaderPressedCurrentState) + { + ColumnHeaderPressed = std::nullopt; + ColumnHeaderPressedCurrentState = false; + Invalidate(); + } } void CustomListView::Paint(rct_window* w, rct_drawpixelinfo* dpi, const rct_scroll* scroll) const @@ -683,4 +703,9 @@ std::optional CustomListView::GetItemIndexAt(const ScreenCoordsXY& po return result; } +void CustomListView::Invalidate() +{ + ParentWindow->Invalidate(); +} + #endif diff --git a/src/openrct2-ui/scripting/CustomListView.h b/src/openrct2-ui/scripting/CustomListView.h index a6cef7d641..e51fe0df98 100644 --- a/src/openrct2-ui/scripting/CustomListView.h +++ b/src/openrct2-ui/scripting/CustomListView.h @@ -145,6 +145,7 @@ namespace OpenRCT2::Ui::Windows rct_drawpixelinfo* dpi, const ScreenCoordsXY& pos, const ScreenSize& size, const char* text, bool isHighlighted) const; std::optional GetItemIndexAt(const ScreenCoordsXY& pos); + void Invalidate(); }; } // namespace OpenRCT2::Ui::Windows