# HG changeset patch # User rubidium # Date 2009-03-19 17:58:25 # Node ID 7360554fa9a23b04b0d29671a3c6ed33b3ffa749 # Parent 860d95457471d85b4a37b470a39b7713fb619a14 (svn r15767) -Fix: infinite loop when skipping sprites when a GRF is invalid (or truncated). diff --git a/src/spritecache.cpp b/src/spritecache.cpp --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -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 */