Mercurial > hg > openttd
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); } }