ID: 48048 User updated by: php at codecaster dot nl Reported By: php at codecaster dot nl Status: Bogus Bug Type: Zip Related Operating System: FreeBSD 7 PHP Version: 5.2.9 New Comment:
The function zip_entry_compressedsize returns the compressed file size (referred to as "directory entry" in the Manual), which is 2 bytes for a zero-size file. The actual (uncompressed) size returned by zip_entry_filesize indeed is 0, which is correct, but that was not the issue. The problem is that the bsdtar program has only recently been patched for this issue as can be read here: http://code.google.com/p/libarchive/issues/detail?id=3 If you would have executed the provided code and opened the zip file in any program you would have seen the compressed size is 2 bytes, which is "a silly thing to do, as it only makes the file larger". We are not always able to patch libarchive/bsdtar, neither are we always able to use other programs than tar. Previous Comments: ------------------------------------------------------------------------ [2009-05-07 13:02:50] j...@php.net RTFM: "zip_entry_compressedsize() Returns the compressed size of the specified directory entry." When you use the correct function zip_entry_filesize() the output is 0 as it should be. Also the "corrupt.zip" is not corrupt at all, you can unzip it just fine with regular unzip found in pretty much every *nix. :) ------------------------------------------------------------------------ [2009-04-28 11:58:44] php at codecaster dot nl I have installed the latest build, PHP 5.2.10-dev. Same results. >From phpinfo(): Zip enabled Extension Version $Id: php_zip.c,v 1.1.2.50 2009/03/01 17:35:25 iliaa Exp $ Zip version 1.8.11 Libzip version 0.9.0 Updated test script (will output 2, should be 0): <?php // create empty file if (file_put_contents("empty.txt", "") === false) { die("Cannot write files"); } // zip it using ZipArchive $zip = new ZipArchive(); $zip->open("corrupt.zip", ZIPARCHIVE::CREATE); $zip->addFile("empty.txt"); $zip->close(); // open the file, show compressed size (returns 2, should be 0) if (($zip = zip_open("corrupt.zip"))) { // read first entry $zip_entry = zip_read($zip); echo "Compressed Size: " . zip_entry_compressedsize($zip_entry); zip_close($zip); } ?> ------------------------------------------------------------------------ [2009-04-22 14:38:46] php at codecaster dot nl Description: ------------ When you use ZipArchive->addFile() on an empty file, the file will be compressed anyway. This is incorrectly read by some (older) decompression programs. Reproduce code: --------------- if (file_put_contents("empty.txt", "") === false) { die("Cannot write files"); } $zip = new ZipArchive(); $zip->open("corrupt.zip", ZIPARCHIVE::CREATE); $zip->addFile("empty.txt"); $zip->close(); Expected result: ---------------- A zip file containing empty.txt with a size of 0 bytes and a compressed size of 0 bytes. Actual result: -------------- A zip file containing empty.txt with a size of 0 bytes and a compressed size of 2 bytes. ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=48048&edit=1