qualified namespaces). (Kalle, Jani)
- Fixed bug #49074 (private class static fields can be modified by using
reflection). (Jani)
+- Fixed bug #49072 (feof never returns true for damaged file in zip). (Pierre)
- Fixed bug #49108 (2nd scan_dir produces segfault). (Felipe)
- Fixed bug #49065 ("disable_functions" php.ini option does not work on
Zend extensions). (Stas)
}
return 0;
}
-
+
if ((zf->flags & ZIP_ZF_DECOMP) == 0) {
ret = _zip_file_fillbuf(outbuf, toread, zf);
if (ret > 0) {
ret = inflate(zf->zstr, Z_SYNC_FLUSH);
switch (ret) {
- case Z_OK:
case Z_STREAM_END:
+ zf->flags |= ZIP_ZF_EOF;
+
+ case Z_OK:
+
/* all ok */
/* Z_STREAM_END probably won't happen, since we didn't
have a header */
len = zf->zstr->total_out - out_before;
if (len >= zf->bytes_left || len >= toread) {
- if (zf->flags & ZIP_ZF_CRC)
- zf->crc = crc32(zf->crc, (Bytef *)outbuf, len);
+ if (zf->flags & ZIP_ZF_CRC) {
+ zf->crc = crc32(zf->crc, (Bytef *)outbuf, len);
+ if (zf->flags & ZIP_ZF_EOF == 1) {
+ if (zf->crc != zf->crc_orig) {
+ _zip_error_set(&zf->error, ZIP_ER_CRC, 0);
+ return -1;
+ }
+
+ }
+ }
zf->bytes_left -= len;
return len;
}
--- /dev/null
+--TEST--
+Bug #49072 (feof never returns true for damaged file in zip)
+--SKIPIF--
+<?php
+/* $Id$ */
+if(!extension_loaded('zip')) die('skip');
+?>
+--FILE--
+<?php
+$f = dirname(__FILE__) . '/bug49072.zip';
+$o = new ZipArchive();
+if (! $o->open($f, ZipArchive::CHECKCONS)) {
+ exit ('error can\'t open');
+}
+$r = $o->getStream('file1'); // this file has a wrong crc
+if (!$r)die('failed to open a stream for file1');
+$s = '';
+while (! feof($r)) {
+ $s .= fread($r,1024);
+}
+?>
+--EXPECTF--
+
+Warning: fread(): Zip stream error: CRC error in %s on line %d
#if HAVE_ZIP
#ifdef ZEND_ENGINE_2
+#include "lib/zip.h"
#include "lib/zip.h"
#include "php_streams.h"
if (self->za && self->zf) {
n = (size_t)zip_fread(self->zf, buf, (int)count);
-
- if (n == 0) {
+ if (n < 0) {
+ int ze, se;
+ zip_file_error_get(self->zf, &ze, &se);
+ stream->eof = 1;
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Zip stream error: %s", zip_file_strerror(self->zf));
+ return 0;
+ }
+ if (n == 0 || n < count) {
stream->eof = 1;
} else {
self->cursor += n;
}
}
- return n<1 ? 0 : n;
+ return (n < 1 ? 0 : n);
}
/* }}} */
{
STREAM_DATA_FROM_STREAM();
if (close_handle) {
- if (self->za) {
- zip_close(self->za);
- self->za = NULL;
- }
if (self->zf) {
zip_fclose(self->zf);
self->zf = NULL;
}
+
+ if (self->za) {
+ zip_close(self->za);
+ self->za = NULL;
+ }
}
efree(self);
stream->abstract = NULL;