From b5dea7f2368629fb61ee98d5071810fc8f16dcc8 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Wed, 6 Jun 2018 18:38:18 +0100 Subject: [PATCH] Fix undefined behaviour in Vehicle destructor --- src/vehicle.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 9e1148471c..687ffc356a 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -977,6 +977,10 @@ void Vehicle::PreDestructor() StopGlobalFollowVehicle(this); ReleaseDisastersTargetingVehicle(this->index); + + /* sometimes, eg. for disaster vehicles, when company bankrupts, when removing crashed/flooded vehicles, + * it may happen that vehicle chain is deleted when visible */ + if (this->IsDrawn()) this->MarkAllViewportsDirty(); } Vehicle::~Vehicle() @@ -988,9 +992,12 @@ Vehicle::~Vehicle() if (this->breakdowns_since_last_service) _vehicles_to_pay_repair.erase(this); - /* sometimes, eg. for disaster vehicles, when company bankrupts, when removing crashed/flooded vehicles, - * it may happen that vehicle chain is deleted when visible */ - if (this->IsDrawn()) this->MarkAllViewportsDirty(); + if (this->type < VEH_BEGIN || this->type >= VEH_COMPANY_END) { + /* sometimes, eg. for disaster vehicles, when company bankrupts, when removing crashed/flooded vehicles, + * it may happen that vehicle chain is deleted when visible. + * Do not redo this for vehicle types where it is done in PreDestructor(). */ + if (this->IsDrawn()) this->MarkAllViewportsDirty(); + } Vehicle *v = this->Next(); this->SetNext(NULL);