iliaa           Wed Sep 18 16:37:24 2002 EDT

  Modified files:              
    /php4/ext/standard  image.c 
  Log:
  Added additional handlers for compressed swf files, which require
  entire file to be downloaded for successful decompression.
  
  
Index: php4/ext/standard/image.c
diff -u php4/ext/standard/image.c:1.68 php4/ext/standard/image.c:1.69
--- php4/ext/standard/image.c:1.68      Fri Sep  6 02:39:57 2002
+++ php4/ext/standard/image.c   Wed Sep 18 16:37:24 2002
@@ -16,7 +16,7 @@
    |          Marcus Boerger <[EMAIL PROTECTED]>                              |
    +----------------------------------------------------------------------+
  */
-/* $Id: image.c,v 1.68 2002/09/06 06:39:57 hyanantha Exp $ */
+/* $Id: image.c,v 1.69 2002/09/18 20:37:24 iliaa Exp $ */
 /*
  * Based on Daniel Schmitt's imageinfo.c which carried the following
  * Copyright notice.
@@ -208,8 +208,10 @@
 
        long bits;
        unsigned char a[64];
-       unsigned long len = 64;
-       char *b;
+       unsigned long len=64, szlength;
+       int factor=1,maxfactor=16;
+       int slength, status=0;
+       char *b, *buf=NULL, *bufz=NULL;
 
        b = ecalloc (1, len + 1);
 
@@ -217,13 +219,52 @@
        php_stream_seek(stream, 5, SEEK_CUR);
 
        php_stream_read(stream, a, sizeof(a)); /* fread(a, sizeof(a), 1, fp); */
-       uncompress (b, &len, a, sizeof(a));
+       if (uncompress(b, &len, a, sizeof(a)) != Z_OK) {
+               /* failed to decompress the file, will try reading the rest of the 
+file */
+               php_stream_seek(stream, 8, SEEK_SET);
+               slength = php_stream_copy_to_mem(stream, &bufz, PHP_STREAM_COPY_ALL, 
+0);
+               
+               /*
+                * zlib::uncompress() wants to know the output data length
+                * if none was given as a parameter
+                * we try from input length * 2 up to input length * 2^8
+                * doubling it whenever it wasn't big enough
+                * that should be eneugh for all real life cases
+               */
+               
+               do {
+                       szlength=slength*(1<<factor++);
+                       buf = (char *) erealloc(buf,szlength);
+                       if (!buf) {
+                               status = 1;
+                               break;
+                       } 
+                       status = uncompress(buf, &szlength, bufz, slength);
+               } while ((status==Z_BUF_ERROR)&&(factor<maxfactor));
+               
+               if (bufz) {
+                       pefree(bufz, 0);
+               }       
+               
+               if (status == Z_OK) {
+                        memcpy(b, buf, len);
+               }
+               
+               if (buf) { 
+                       efree(buf);
+               }       
+       }
        
-       bits = php_swf_get_bits (b, 0, 5);
-       result->width = (php_swf_get_bits (b, 5 + bits, bits) -
-               php_swf_get_bits (b, 5, bits)) / 20;
-       result->height = (php_swf_get_bits (b, 5 + (3 * bits), bits) -
-               php_swf_get_bits (b, 5 + (2 * bits), bits)) / 20;
+       if (!status) {
+               bits = php_swf_get_bits (b, 0, 5);
+               result->width = (php_swf_get_bits (b, 5 + bits, bits) -
+                       php_swf_get_bits (b, 5, bits)) / 20;
+               result->height = (php_swf_get_bits (b, 5 + (3 * bits), bits) -
+                       php_swf_get_bits (b, 5 + (2 * bits), bits)) / 20;
+       } else {
+               result->width = result->height = 0;
+       }       
+               
        efree (b);
        result->bits     = 0;
        result->channels = 0;



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to