changeset 20041:ce1c3223e878 draft

(svn r24973) -Fix [FS#5462]: Prevent access to tile-based variables when tile is invalid.
author peter1138 <peter1138@openttd.org>
date Tue, 05 Feb 2013 21:38:38 +0000
parents f777d5b0eb03
children 26fd3e92ba75
files src/newgrf_industries.cpp
diffstat 1 files changed, 17 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf_industries.cpp
+++ b/src/newgrf_industries.cpp
@@ -225,7 +225,9 @@
 		}
 
 		/* Manhattan distance of closes dry/water tile */
-		case 0x43: return GetClosestWaterDistance(this->tile, (indspec->behaviour & INDUSTRYBEH_BUILT_ONWATER) == 0);
+		case 0x43:
+			if (this->tile == INVALID_TILE) break;
+			return GetClosestWaterDistance(this->tile, (indspec->behaviour & INDUSTRYBEH_BUILT_ONWATER) == 0);
 
 		/* Layout number */
 		case 0x44: return this->industry->selected_layout;
@@ -253,15 +255,19 @@
 
 		/* Get random tile bits at offset param */
 		case 0x61: {
+			if (this->tile == INVALID_TILE) break;
 			TileIndex tile = GetNearbyTile(parameter, this->tile, false);
 			return this->industry->TileBelongsToIndustry(tile) ? GetIndustryRandomBits(tile) : 0;
 		}
 
 		/* Land info of nearby tiles */
-		case 0x62: return GetNearbyIndustryTileInformation(parameter, this->tile, INVALID_INDUSTRY, false, this->ro->grffile->grf_version >= 8);
+		case 0x62:
+			if (this->tile == INVALID_TILE) break;
+			return GetNearbyIndustryTileInformation(parameter, this->tile, INVALID_INDUSTRY, false, this->ro->grffile->grf_version >= 8);
 
 		/* Animation stage of nearby tiles */
 		case 0x63: {
+			if (this->tile == INVALID_TILE) break;
 			TileIndex tile = GetNearbyTile(parameter, this->tile, false);
 			if (this->industry->TileBelongsToIndustry(tile)) {
 				return GetAnimationFrame(tile);
@@ -270,11 +276,17 @@
 		}
 
 		/* Distance of nearest industry of given type */
-		case 0x64: return GetClosestIndustry(this->tile, MapNewGRFIndustryType(parameter, indspec->grf_prop.grffile->grfid), this->industry);
+		case 0x64:
+			if (this->tile == INVALID_TILE) break;
+			return GetClosestIndustry(this->tile, MapNewGRFIndustryType(parameter, indspec->grf_prop.grffile->grfid), this->industry);
 		/* Get town zone and Manhattan distance of closest town */
-		case 0x65: return GetTownRadiusGroup(this->industry->town, this->tile) << 16 | min(DistanceManhattan(this->tile, this->industry->town->xy), 0xFFFF);
+		case 0x65:
+			if (this->tile == INVALID_TILE) break;
+			return GetTownRadiusGroup(this->industry->town, this->tile) << 16 | min(DistanceManhattan(this->tile, this->industry->town->xy), 0xFFFF);
 		/* Get square of Euclidian distance of closes town */
-		case 0x66: return GetTownRadiusGroup(this->industry->town, this->tile) << 16 | min(DistanceSquare(this->tile, this->industry->town->xy), 0xFFFF);
+		case 0x66:
+			if (this->tile == INVALID_TILE) break;
+			return GetTownRadiusGroup(this->industry->town, this->tile) << 16 | min(DistanceSquare(this->tile, this->industry->town->xy), 0xFFFF);
 
 		/* Count of industry, distance of closest instance
 		 * 68 is the same as 67, but with a filtering on selected layout */