changeset 8255:dc16e054fd8f draft

(svn r11819) -Fix: do not access the Vehicle struct that has been already deleted when removing crashed train
author smatz <smatz@openttd.org>
date Sat, 12 Jan 2008 19:20:44 +0000
parents 7d580c9c41fb
children 3ddf51e9aa83
files src/train_cmd.cpp
diffstat 1 files changed, 13 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -3122,22 +3122,26 @@
 	BeginVehicleMove(v);
 	EndVehicleMove(v);
 
+	/* 'v' shouldn't be accessed after it has been deleted */
+	TrackBits track = v->u.rail.track;
+	TileIndex tile = v->tile;
+
 	delete v;
 
-	if (v->u.rail.track != TRACK_BIT_DEPOT && v->u.rail.track != TRACK_BIT_WORMHOLE)
-		SetSignalsOnBothDir(v->tile, (Track)(FIND_FIRST_BIT(v->u.rail.track)));
+	if (track != TRACK_BIT_DEPOT && track != TRACK_BIT_WORMHOLE)
+		SetSignalsOnBothDir(tile, (Track)(FIND_FIRST_BIT(track)));
 
 	/* Check if the wagon was on a road/rail-crossing and disable it if no
 	 * others are on it */
-	DisableTrainCrossing(v->tile);
-
-	if (v->u.rail.track == TRACK_BIT_WORMHOLE) { // inside a tunnel / bridge
-		TileIndex endtile = GetOtherTunnelBridgeEnd(v->tile);
-
-		if (GetVehicleTunnelBridge(v->tile, endtile) != NULL) return; // tunnel / bridge is busy
+	DisableTrainCrossing(tile);
+
+	if (track == TRACK_BIT_WORMHOLE) { // inside a tunnel / bridge
+		TileIndex endtile = GetOtherTunnelBridgeEnd(tile);
+
+		if (GetVehicleTunnelBridge(tile, endtile) != NULL) return; // tunnel / bridge is busy
 
 		/* v->direction is "random", so it cannot be used to determine the direction of the track */
-		UpdateSignalsOnSegment(v->tile, INVALID_DIAGDIR);
+		UpdateSignalsOnSegment(tile, INVALID_DIAGDIR);
 	}
 }