(svn r22878) -Fix (r22873-ish): Check range before casting to uint16.
This commit is contained in:
		| @@ -106,13 +106,15 @@ static bool LoadPNG(SpriteLoader::Sprite *sprite, const char *filename, uint32 i | |||||||
| 			if (strcmp("y_offs", text_ptr[i].key) == 0) sprite->y_offs = strtol(text_ptr[i].text, NULL, 0); | 			if (strcmp("y_offs", text_ptr[i].key) == 0) sprite->y_offs = strtol(text_ptr[i].text, NULL, 0); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		sprite->height = png_get_image_height(png_ptr, info_ptr); | 		uint height = png_get_image_height(png_ptr, info_ptr); | ||||||
| 		sprite->width  = png_get_image_width(png_ptr, info_ptr); | 		uint width  = png_get_image_width(png_ptr, info_ptr); | ||||||
| 		/* Check if sprite dimensions aren't larger than what is allowed in GRF-files. */ | 		/* Check if sprite dimensions aren't larger than what is allowed in GRF-files. */ | ||||||
| 		if (sprite->height > UINT8_MAX || sprite->width > UINT16_MAX) { | 		if (height > UINT8_MAX || width > UINT16_MAX) { | ||||||
| 			png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); | 			png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
|  | 		sprite->height = height; | ||||||
|  | 		sprite->width  = width; | ||||||
| 		sprite->AllocateData(sprite->width * sprite->height); | 		sprite->AllocateData(sprite->width * sprite->height); | ||||||
| 	} else if (sprite->height != png_get_image_height(png_ptr, info_ptr) || sprite->width != png_get_image_width(png_ptr, info_ptr)) { | 	} else if (sprite->height != png_get_image_height(png_ptr, info_ptr) || sprite->width != png_get_image_width(png_ptr, info_ptr)) { | ||||||
| 		/* Make sure the mask image isn't larger than the sprite image. */ | 		/* Make sure the mask image isn't larger than the sprite image. */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 frosch
					frosch