Changeset - r11405:7360554fa9a2
[Not reviewed]
master
0 1 0
rubidium - 15 years ago 2009-03-19 17:58:25
rubidium@openttd.org
(svn r15767) -Fix: infinite loop when skipping sprites when a GRF is invalid (or truncated).
1 file changed with 5 insertions and 4 deletions:
0 comments (0 inline, 0 general)
src/spritecache.cpp
Show inline comments
 
@@ -80,8 +80,9 @@ static void CompactSpriteCache();
 
 * Skip the given amount of sprite graphics data.
 
 * @param type the type of sprite (compressed etc)
 
 * @param num the amount of sprites to skip
 
 * @return true if the data could be correctly skipped.
 
 */
 
void SkipSpriteData(byte type, uint16 num)
 
bool SkipSpriteData(byte type, uint16 num)
 
{
 
	if (type & 2) {
 
		FioSkipBytes(num);
 
@@ -90,6 +91,7 @@ void SkipSpriteData(byte type, uint16 nu
 
			int8 i = FioReadByte();
 
			if (i >= 0) {
 
				int size = (i == 0) ? 0x80 : i;
 
				if (size > num) return false;
 
				num -= size;
 
				FioSkipBytes(size);
 
			} else {
 
@@ -99,6 +101,7 @@ void SkipSpriteData(byte type, uint16 nu
 
			}
 
		}
 
	}
 
	return true;
 
}
 

	
 
/**
 
@@ -120,9 +123,7 @@ static SpriteType ReadSpriteHeaderSkipDa
 
	}
 

	
 
	FioSkipBytes(7);
 
	SkipSpriteData(type, num - 8);
 

	
 
	return ST_NORMAL;
 
	return SkipSpriteData(type, num - 8) ? ST_NORMAL : ST_INVALID;
 
}
 

	
 
/* Check if the given Sprite ID exists */
0 comments (0 inline, 0 general)