#46985 [Com]: ZIP can not produce valid archive

From: Date: Thu, 01 Jan 2009 14:44:01 +0000
Subject: #46985 [Com]: ZIP can not produce valid archive
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-132480@lists.php.net to get a copy of this message
 ID:               46985
 Comment by:       php at undoso dot eu
 Reported By:      killerbg at gmail dot com
 Status:           Feedback
 Bug Type:         Zip Related
 Operating System: Windows XP Professional SP3
 PHP Version:      5.2.8
 Assigned To:      pajoye
 New Comment:

I have the same issue. It seems that compressing short strings works
fine but using huge ones gets them corrupted. Even if the resulting zip
might open, using a simple md5 on both files often prove that they
differs which is not great...

I downloaded PHP 5.2.6 and replaced the php_zip.dll of 5.2.8 by the
5.2.6 version. It fixed the problem right away. There is really some
kind of regression in 5.2.8.


Previous Comments:
------------------------------------------------------------------------

[2009-01-01 00:38:55] pajoye@php.net

It works just fine here (in apache2 sapi, iis, fcgi and cli).

Can you try the following script please? I suspect some other errors
happening and they are not displayed. Be sure to have display_errors
activated.

By the way, in the latest releases there are "addFromPattern"/"Glob"
functions which let you add recursively something like "*.jpeg" :)

<?php
$path = 'C:\yourpath\\';
$count = 0;


function archive($path, $local)
{
	global $zip, $count;
	if ($handle = opendir($path)) {
		while (($file = readdir($handle)) !== false) {
			if (($file != ".") && ($file != "..")) {
				echo "$file\n";
				var_dump($local, $file, $path);
				if (is_dir($path . $file)) {
					$zip->addEmptyDir($local . $file . "/");
					archive($path . $file . "/", $local . $file . "/");
				} elseif (is_file($path . $file)) {
					if ($count > 128) {
						$zip->close();
						$zip->open($GLOBALS["file"]);
						$count = 0;
					}
					$zip->addFile($path . $file, $local . $file);
					$count++;
				}
			}
		}
		closedir($handle);
	}
	echo "count: $count\n";
}
$file = 't.zip';

$zip = new ZipArchive();

if (($zip->open($file, ZipArchive::CREATE)) === TRUE) {
	archive($path, null);
	$zip->close();

}

echo "done\n";


------------------------------------------------------------------------

[2008-12-31 23:12:49] killerbg at gmail dot com

Here is an archive containing both the corrupted file created with the
new versions, a good file created with the same script and older version
(5.2.6) and the script used -
http://rapidshare.com/files/178582253/Error.zip.html

------------------------------------------------------------------------

[2008-12-31 21:21:33] pajoye@php.net

I can't reproduce it here (xp sp3 and vista/2k8).

Please provide the file(s) (the minimum required to create a corrupted
archive) and the script you are using.

------------------------------------------------------------------------

[2008-12-31 20:27:12] killerbg at gmail dot com

Description:
------------
On Windows XP Professional Service Pack 3 with Apache 2.2.11 and PHP
5.2.8 - PHP 5.2.9 loaded as dynamic module when creating archive and
adding files and/or folders the ouput is incorrect and the file gets
corrupted. Even trying to open it again with the script results error
code 19.

Reproduce code:
---------------
$file = tempnam("/tmp/", "php");
$zip = new ZipArchive();
if (($zip->open($file, ZipArchive::OVERWRITE)) === TRUE)
{
	$zip->addEmptyDir("Directory");
	$zip->addFile("File");
	$zip->close();
}


Expected result:
----------------
Correctly created zip archive file with unique name located in the
temporaly directory.

Actual result:
--------------
Only the firsts few added files visible but corrupted acording to the
crc32 record.


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=46985&edit=1



Thread (9 messages)

« previous php.bugs (#132480) next »