Fix #70322: ZipArchive::close() doesn't indicate errors

If an archive can't be written, ZipArchive::close() nonetheless returns TRUE.
We fix the return value to properly return success, and additionally raise a
warning on failure.
This commit is contained in:
Christoph M. Becker 2015-08-21 22:26:26 +02:00 committed by Christoph M. Becker
parent 4b1dff6f43
commit c77f783777
3 changed files with 39 additions and 3 deletions

View file

@ -1616,6 +1616,7 @@ static ZIPARCHIVE_METHOD(close)
struct zip *intern;
zval *this = getThis();
ze_zip_object *ze_obj;
int err;
if (!this) {
RETURN_FALSE;
@ -1625,7 +1626,8 @@ static ZIPARCHIVE_METHOD(close)
ze_obj = (ze_zip_object*) zend_object_store_get_object(this TSRMLS_CC);
if (zip_close(intern)) {
if (err = zip_close(intern)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, zip_strerror(intern));
zip_discard(intern);
}
@ -1634,7 +1636,11 @@ static ZIPARCHIVE_METHOD(close)
ze_obj->filename_len = 0;
ze_obj->za = NULL;
RETURN_TRUE;
if (!err) {
RETURN_TRUE;
} else {
RETURN_FALSE;
}
}
/* }}} */

View file

@ -0,0 +1,29 @@
--TEST--
Bug #70322 (ZipArchive::close() doesn't indicate errors)
--DESCRIPTION--
We want to test whether ZipArchive::close() returns FALSE and raises a warning
on failure, so we force the failure by adding a file to the archive, which we
delete before closing.
--SKIPIF--
<?php
if (!extension_loaded('zip')) die('skip requires zip extension');
?>
--FILE--
<?php
$zipfile = __DIR__ . '/bug70322.zip';
$textfile = __DIR__ . '/bug70322.txt';
touch($textfile);
$zip = new ZipArchive();
$zip->open($zipfile, ZipArchive::CREATE);
$zip->addFile($textfile);
unlink($textfile);
var_dump($zip->close());
?>
--CLEAN--
<?php
// we don't expect the archive to be created, but clean up just in case...
@unlink(__DIR__ . '/bug70322.zip');
?>
--EXPECTF--
Warning: ZipArchive::close(): Read error: No such file or directory in %s%ebug70322.php on line %d
bool(false)

View file

@ -63,7 +63,8 @@ $sb = $zip->statIndex(1);
var_dump($sb);
$sb = $zip->statIndex(2);
var_dump($sb);
$zip->close();
// suppress irrelevant error message:
@$zip->close();
unset($zip);
if (file_exists($file)) {