diff src/saveload/afterload.cpp @ 17285:be523f4fc2cb draft

(svn r22025) -Fix: verify there is enough space in the pool when creating new pool items while loading old savegames
author smatz <smatz@openttd.org>
date Tue, 08 Feb 2011 18:34:13 +0000 (2011-02-08)
parents 5b204f51b151
children 2ed9720f1bb1
line wrap: on
line diff
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -782,11 +782,18 @@
 					case STATION_TRUCK:
 					case STATION_BUS:
 						if (IsSavegameVersionBefore(6)) {
+							/* Before version 5 you could not have more than 250 stations.
+							 * Version 6 adds large maps, so you could only place 253*253
+							 * road stops on a map (no freeform edges) = 64009. So, yes
+							 * someone could in theory create such a full map to trigger
+							 * this assertion, it's safe to assume that's only something
+							 * theoretical and does not happen in normal games. */
+							assert(RoadStop::CanAllocateItem());
+
 							/* From this version on there can be multiple road stops of the
 							 * same type per station. Convert the existing stops to the new
 							 * internal data structure. */
 							RoadStop *rs = new RoadStop(t);
-							if (rs == NULL) error("Too many road stops in savegame");
 
 							RoadStop **head =
 								IsTruckStop(t) ? &st->truck_stops : &st->bus_stops;
@@ -1928,6 +1935,12 @@
 					ObjectType type = GetObjectType(t);
 					int size = type == OBJECT_HQ ? 2 : 1;
 
+					if (!Object::CanAllocateItem()) {
+						/* Nice... you managed to place 64k lighthouses and
+						 * antennae on the map... boohoo. */
+						SlError(STR_ERROR_TOO_MANY_OBJECTS);
+					}
+
 					Object *o = new Object();
 					o->location.tile = t;
 					o->location.w    = size;
@@ -2024,6 +2037,10 @@
 		FOR_ALL_STATIONS(st) {
 			std::list<Vehicle *>::iterator iter;
 			for (iter = st->loading_vehicles.begin(); iter != st->loading_vehicles.end(); ++iter) {
+				/* There are always as many CargoPayments as Vehicles. We need to make the
+				 * assert() in Pool::GetNew() happy by calling CanAllocateItem(). */
+				assert_compile(CargoPaymentPool::MAX_SIZE == VehiclePool::MAX_SIZE);
+				assert(CargoPayment::CanAllocateItem());
 				Vehicle *v = *iter;
 				if (v->cargo_payment == NULL) v->cargo_payment = new CargoPayment(v);
 			}