From: Greg Beaver Date: Thu, 29 May 2008 17:34:58 +0000 (+0000) Subject: MFB: fix PECL bug #13981: Third-party zips fail entry interrogation X-Git-Tag: BEFORE_HEAD_NS_CHANGE~1630 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=195ee5ca733845ef090ef4fdbe9d0ee5d22ab4c0;p=php MFB: fix PECL bug #13981: Third-party zips fail entry interrogation --- diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 5a203b5347..f38188e957 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -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); diff --git a/ext/phar/tests/zip/unixzip.phpt b/ext/phar/tests/zip/unixzip.phpt index 374489d013..8eda6e025d 100644 --- a/ext/phar/tests/zip/unixzip.phpt +++ b/ext/phar/tests/zip/unixzip.phpt @@ -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