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;
         }