Changeset - r9968:45fe01d99177
[Not reviewed]
master
0 1 0
frosch - 16 years ago 2008-08-21 20:42:45
frosch@openttd.org
(svn r14125) -Fix [FS#2237]: Segfault when autoreplace failed very early.
Note: Proper indenting in next commit.
1 file changed with 13 insertions and 10 deletions:
0 comments (0 inline, 0 general)
src/autoreplace_cmd.cpp
Show inline comments
 
@@ -367,13 +367,13 @@ static CommandCost ReplaceChain(Vehicle 
 
		}
 
		Vehicle *new_head = (new_vehs[0] != NULL ? new_vehs[0] : old_vehs[0]);
 

	
 
		/* Separate the head, so we can start constructing the new chain */
 
		/* Note: When autoreplace has already failed here, old_vehs[] is not completely initialized. But it is also not needed. */
 
		if (cost.Succeeded()) {
 
			/* Separate the head, so we can start constructing the new chain */
 
			Vehicle *second = GetNextUnit(old_head);
 
			if (second != NULL) cost.AddCost(MoveVehicle(second, NULL, DC_EXEC | DC_AUTOREPLACE, true));
 

	
 
			assert(GetNextUnit(new_head) == NULL);
 
		}
 

	
 
		/* Append engines to the new chain
 
		 * We do this from back to front, so that the head of the temporary vehicle chain does not change all the time.
 
@@ -468,7 +468,9 @@ static CommandCost ReplaceChain(Vehicle 
 
			}
 
		}
 

	
 
		/* If we are not in DC_EXEC undo everything */
 
		/* If we are not in DC_EXEC undo everything, i.e. rearrange old vehicles.
 
		 * We do this from back to front, so that the head of the temporary vehicle chain does not change all the time.
 
		 * Note: The vehicle attach callback is disabled here :) */
 
		if ((flags & DC_EXEC) == 0) {
 
			/* Separate the head, so we can reattach the old vehicles */
 
			Vehicle *second = GetNextUnit(old_head);
 
@@ -476,15 +478,16 @@ static CommandCost ReplaceChain(Vehicle 
 

	
 
			assert(GetNextUnit(old_head) == NULL);
 

	
 
			/* Rearrange old vehicles and sell new
 
			 * We do this from back to front, so that the head of the temporary vehicle chain does not change all the time.
 
			 * Note: The vehicle attach callback is disabled here :) */
 
			for (int i = num_units - 1; i > 0; i--) {
 
				CommandCost ret = MoveVehicle(old_vehs[i], old_head, DC_EXEC | DC_AUTOREPLACE, false);
 
				assert(ret.Succeeded());
 
			}
 
		}
 
		}
 

	
 
		/* Finally undo buying of new vehicles */
 
		if ((flags & DC_EXEC) == 0) {
 
			for (int i = num_units - 1; i >= 0; i--) {
 
				if (i > 0) {
 
					CommandCost ret = MoveVehicle(old_vehs[i], old_head, DC_EXEC | DC_AUTOREPLACE, false);
 
					assert(ret.Succeeded());
 
				}
 
				if (new_vehs[i] != NULL) {
 
					DoCommand(0, new_vehs[i]->index, 0, DC_EXEC, GetCmdSellVeh(new_vehs[i]));
 
					new_vehs[i] = NULL;
0 comments (0 inline, 0 general)