changeset 9128:acbafd7c6377 draft

(svn r12988) -Fix [FS#1992](r12913): [autoreplace] failing to replace a road vehicle could free it's slot without the vehicle knowing it (leading to assert)
author bjarni <bjarni@openttd.org>
date Wed, 07 May 2008 13:11:33 +0000
parents 428852b86d4d
children 51ca2dd909b4
files src/vehicle.cpp
diffstat 1 files changed, 10 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/vehicle.cpp
+++ b/src/vehicle.cpp
@@ -2746,6 +2746,10 @@
 
 	assert(v->owner == p->index);
 
+	/* Cache the result of the vehicle type check since it will not change
+	 * and we need this check once for every run though the loop. */
+	bool is_road_veh = v->type == VEH_ROAD;
+
 	while (true) {
 		Vehicle *dest = GetVehicle(backup->index);
 		/* The vehicle should be free since we are restoring something we just sold. */
@@ -2761,6 +2765,12 @@
 		dest->left_coord = INVALID_COORD;
 		UpdateVehiclePosHash(dest, INVALID_COORD, 0);
 
+		if (is_road_veh) {
+			/* Removed the slot in the road vehicles as the slot is gone.
+			 * We don't want a pointer to a slot that's gone.              */
+			dest->u.road.slot = NULL;
+		}
+
 		if (!dest->cargo.Empty()) {
 			/* The vehicle in question contains some cargo.
 			 * However we lost the list so we will have to recreate it.