]> granicus.if.org Git - php/commitdiff
fix PECL bug #13981: Third-party zips fail entry interrogation
authorGreg Beaver <cellog@php.net>
Thu, 29 May 2008 17:34:50 +0000 (17:34 +0000)
committerGreg Beaver <cellog@php.net>
Thu, 29 May 2008 17:34:50 +0000 (17:34 +0000)
ext/phar/phar.c
ext/phar/tests/zip/unixzip.phpt

index 5a203b53474161b4798d5b6ab72dc45d164a9c5e..f38188e957510628b514027ab14ad9385af0ad24 100644 (file)
@@ -1980,15 +1980,16 @@ int phar_postprocess_file(php_stream_wrapper *wrapper, int options, phar_entry_d
                        spprintf(error, 0, "phar error: internal corruption of zip-based phar \"%s\" (cannot read local file header for file \"%s\")", idata->phar->fname, entry->filename);
                        return FAILURE;
                }
-               /* fix up for big-endian systems */
-               /* verify local header if not yet verified */
+               /* verify local header */
                if (entry->filename_len != PHAR_ZIP_16(local.filename_len) || entry->crc32 != PHAR_ZIP_32(local.crc32) || entry->uncompressed_filesize != PHAR_ZIP_32(local.uncompsize) || entry->compressed_filesize != PHAR_ZIP_32(local.compsize)) {
                        spprintf(error, 0, "phar error: internal corruption of zip-based phar \"%s\" (local head of file \"%s\" does not match central directory)", idata->phar->fname, entry->filename);
                        return FAILURE;
                }
-               if (-1 == php_stream_seek(idata->phar->fp, PHAR_ZIP_16(local.filename_len) + PHAR_ZIP_16(local.extra_len), SEEK_CUR)) {
-                       spprintf(error, 0, "phar error: internal corruption of zip-based phar \"%s\" (cannot seek to start of file data for file \"%s\")", idata->phar->fname, entry->filename);
-                       return FAILURE;
+               /* construct actual offset to file start - local extra_len can be different from central extra_len */
+               entry->offset = entry->offset_abs =
+                       sizeof(local) + entry->header_offset + PHAR_ZIP_16(local.filename_len) + PHAR_ZIP_16(local.extra_len);
+               if (idata->zero != entry->offset_abs) {
+                       idata->zero = entry->offset_abs;
                }
        }
        php_stream_seek(fp, idata->zero, SEEK_SET);     
index 374489d013b7cf10dbce685ceceedbbbb948e21e..8eda6e025d0e2a65bfd77bb677243cba72f482e3 100644 (file)
@@ -10,7 +10,8 @@ foreach ($a as $b) {
        if ($b->isDir()) {
                echo "dir " . $b->getPathName() . "\n";
        } else {
-               echo $b->getPathName() . "\n";
+               echo $b->getPathName(), "\n";
+               echo file_get_contents($b->getPathName()), "\n";
        }
 }
 if (isset($a['notempty/hi.txt'])) {
@@ -19,8 +20,10 @@ if (isset($a['notempty/hi.txt'])) {
 ?>
 ===DONE===
 --EXPECTF--
-dir phar://%szip.zip%cempty
-phar://%szip.zip%chi.txt
-dir phar://%szip.zip%cnotempty
-phar://%szip.zip/notempty/hi.txt
-===DONE===
+dir phar:///home/cellog/workspace/php5/ext/phar/tests/zip/files/zip.zip/empty
+phar:///home/cellog/workspace/php5/ext/phar/tests/zip/files/zip.zip/hi.txt
+hi there
+
+dir phar:///home/cellog/workspace/php5/ext/phar/tests/zip/files/zip.zip/notempty
+phar:///home/cellog/workspace/php5/ext/phar/tests/zip/files/zip.zip/notempty/hi.txt
+===DONE===
\ No newline at end of file