TBTR: Fix use after free when replacing template

pull/199/head
Jonathan G Rennison 4 years ago
parent 5e409c19f0
commit a072b401b6

@ -228,7 +228,7 @@ public:
this->groups.ForceRebuild();
this->groups.NeedResort();
this->BuildGroupList(_local_company);
this->BuildGroupList();
this->matrixContentLeftMargin = 40;
this->selected_template_index = -1;
@ -240,7 +240,8 @@ public:
this->templates.ForceRebuild();
BuildTemplateGuiList(&this->templates, this->vscroll[1], this->owner, this->sel_railtype);
this->templates.ForceRebuild();
this->BuildTemplateGuiList();
}
~TemplateReplaceWindow() {
@ -306,9 +307,8 @@ public:
virtual void OnPaint()
{
BuildTemplateGuiList(&this->templates, this->vscroll[1], this->owner, this->sel_railtype);
this->BuildGroupList(_local_company);
this->BuildGroupList();
this->BuildTemplateGuiList();
/* sets the colour of that art thing */
this->GetWidget<NWidgetCore>(TRW_WIDGET_TRAIN_FLUFF_LEFT)->colour = _company_colours[_local_company];
@ -352,6 +352,9 @@ public:
{
if (this->editInProgress) return;
this->BuildGroupList();
this->BuildTemplateGuiList();
switch (widget) {
case TRW_WIDGET_TMPL_BUTTONS_CONFIGTMPL_REUSE: {
if ((this->selected_template_index >= 0) && (this->selected_template_index < (short)this->templates.size())) {
@ -420,7 +423,7 @@ public:
bool succeeded = DoCommandP(0, template_index, 0, CMD_DELETE_TEMPLATE_VEHICLE, nullptr);
if (succeeded) {
BuildTemplateGuiList(&this->templates, this->vscroll[1], this->owner, this->sel_railtype);
this->templates.ForceRebuild();
selected_template_index = -1;
}
}
@ -479,7 +482,7 @@ public:
if (!succeeded) return false;
BuildTemplateGuiList(&this->templates, vscroll[1], _local_company, this->sel_railtype);
this->templates.ForceRebuild();
this->ToggleWidgetLoweredState(TRW_WIDGET_TMPL_BUTTONS_CLONE);
ResetObjectToPlace();
this->SetDirty();
@ -500,7 +503,7 @@ public:
/* Reset scrollbar positions */
this->vscroll[0]->SetPosition(0);
this->vscroll[1]->SetPosition(0);
BuildTemplateGuiList(&this->templates, this->vscroll[1], this->owner, this->sel_railtype);
this->templates.ForceRebuild();
this->SetDirty();
}
@ -552,7 +555,7 @@ public:
}
}
void BuildGroupList(Owner owner)
void BuildGroupList()
{
if (!this->groups.NeedRebuild()) return;
@ -562,7 +565,7 @@ public:
GUIGroupList list;
for (const Group *g : Group::Iterate()) {
if (g->owner == owner && g->vehicle_type == VEH_TRAIN) {
if (g->owner == this->owner && g->vehicle_type == VEH_TRAIN) {
list.push_back(g);
}
}
@ -578,6 +581,13 @@ public:
this->vscroll[0]->SetCount(groups.size());
}
void BuildTemplateGuiList()
{
if (!this->templates.NeedRebuild()) return;
::BuildTemplateGuiList(&this->templates, this->vscroll[1], this->owner, this->sel_railtype);
}
void DrawAllGroupsFunction(const Rect &r) const
{
int left = r.left + WD_MATRIX_LEFT;
@ -632,6 +642,8 @@ public:
void DrawTemplateList(const Rect &r) const
{
const_cast<TemplateReplaceWindow *>(this)->BuildTemplateGuiList();
int left = r.left;
int right = r.right;
int y = r.top;
@ -780,6 +792,9 @@ public:
void UpdateButtonState()
{
this->BuildGroupList();
this->BuildTemplateGuiList();
bool selected_ok = (this->selected_template_index >= 0) && (this->selected_template_index < (short)this->templates.size());
bool group_ok = (this->selected_group_index >= 0) && (this->selected_group_index < (short)this->groups.size());

Loading…
Cancel
Save