Mercurial > hg > dmlib
changeset 1901:636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 26 Jun 2018 05:03:55 +0300 |
parents | 8c6040d5b930 |
children | 74405ff6bc4a |
files | tools/libgfx.c |
diffstat | 1 files changed, 21 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- 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; }