#48048 [Bgs]: Empty files corrupt zip
| From: | php at codecaster dot nl | Date: | Thu, 07 May 2009 13:17:25 +0000 |
| Subject: | #48048 [Bgs]: Empty files corrupt zip | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-136934@lists.php.net to get a copy of this message | ||
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] jani@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