added handling for incomplete tags during file reading.
[swftools.git] / lib / rfxswf.c
index ed94927..d7f8f88 100644 (file)
@@ -54,8 +54,8 @@ void* rfx_alloc(int size)
 {
   void*ptr;
   if(size == 0) {
-    *(int*)0 = 0xdead;
-    fprintf(stderr, "Warning: Zero alloc\n");
+    //*(int*)0 = 0xdead;
+    //fprintf(stderr, "Warning: Zero alloc\n");
     return 0;
   }
 
@@ -71,8 +71,8 @@ void* rfx_realloc(void*data, int size)
 {
   void*ptr;
   if(size == 0) {
-    *(int*)0 = 0xdead;
-    fprintf(stderr, "Warning: Zero realloc\n");
+    //*(int*)0 = 0xdead;
+    //fprintf(stderr, "Warning: Zero realloc\n");
     rfx_free(data);
     return 0;
   }
@@ -93,8 +93,8 @@ void* rfx_calloc(int size)
 {
   void*ptr;
   if(size == 0) {
-    *(int*)0 = 0xdead;
-    fprintf(stderr, "Warning: Zero alloc\n");
+    //*(int*)0 = 0xdead;
+    //fprintf(stderr, "Warning: Zero alloc\n");
     return 0;
   }
 #ifdef HAVE_CALLOC
@@ -916,7 +916,12 @@ TAG * swf_ReadTag(struct reader_t*reader, TAG * prev)
   if (t->len)
   { t->data = (U8*)rfx_alloc(t->len);
     t->memsize = t->len;
-    if (reader->read(reader, t->data, t->len) != t->len) return NULL;
+    if (reader->read(reader, t->data, t->len) != t->len) {
+      fprintf(stderr, "rfxswf: Warning: Short read (tagid %d). File truncated?\n", t->id);
+      free(t->data);t->data=0;
+      free(t);
+      return NULL;
+    }
   }
 
   if (prev)
@@ -1310,6 +1315,10 @@ int  swf_WriteSWF2(struct writer_t*writer, SWF * swf)     // Writes SWF to file,
       len += swf_WriteTag(-1,t);
       if(t->id == ST_DEFINESPRITE && !swf_IsFolded(t)) inSprite++;
       else if(t->id == ST_END && inSprite) inSprite--;
+      else if(t->id == ST_END && !inSprite) {
+       if(t->prev && t->prev->id!=ST_SHOWFRAME)
+         frameCount++;
+      }
       else if(t->id == ST_SHOWFRAME && !inSprite) frameCount++;
       t = swf_NextTag(t);
   }