# HG changeset patch # User Matti Hamalainen # Date 1529978635 -10800 # Node ID 636d3c8bcd35379a2815d8015d281a1384cf8fcc # Parent 8c6040d5b93038b2a3fb167da92ce4a5e6f06de0 Fix uneven chunk size handling in IFF reader. diff -r 8c6040d5b930 -r 636d3c8bcd35 tools/libgfx.c --- a/tools/libgfx.c Tue Jun 26 04:46:49 2018 +0300 +++ b/tools/libgfx.c Tue Jun 26 05:03:55 2018 +0300 @@ -1478,22 +1478,28 @@ static int dmSkipIFFChunkRest(DMResource *fp, const DMIFFChunk *chunk) { - off_t read = dmftell(fp) - chunk->offs; - if (chunk->size > read) + off_t read = dmftell(fp) - chunk->offs, + size = chunk->size; + + if (size & 1) { - dmMsg(4, "IFF: Skipping %d bytes (%d of %d consumed)\n", - chunk->size - read, read, chunk->size); + dmMsg(3, "IFF: Chunk size %d is uneven, adjusting to %d.\n", + size, size + 1); + size++; + } - if (dmfseek(fp, chunk->size - read, SEEK_CUR) != 0) + if (size > read) + { + dmMsg(3, "IFF: Skipping %d bytes (%d of %d consumed)\n", + size - read, read, size); + + if (dmfseek(fp, size - read, SEEK_CUR) != 0) { return dmError(DMERR_FSEEK, "IFF: Failed to skip chunk end.\n"); } - else - return DMERR_OK; } - else - return DMERR_OK; + return DMERR_OK; } @@ -1845,15 +1851,13 @@ default: - { - dmMsg(4, "Unknown chunk ID '%s', size %d\n", - chunk.idStr, chunk.size); + dmMsg(3, "Unknown chunk ID '%s', size %d\n", + chunk.idStr, chunk.size); - if (dmfseek(fp, chunk.size, SEEK_CUR) != 0) - { - return dmError(DMERR_FSEEK, - "IFF: Error skipping in file."); - } + if (dmfseek(fp, chunk.size, SEEK_CUR) != 0) + { + return dmError(DMERR_FSEEK, + "IFF: Error skipping in file."); } break; }