diff options
Diffstat (limited to 'ext/zip')
| -rw-r--r-- | ext/zip/php_zip.c | 35 | ||||
| -rw-r--r-- | ext/zip/tests/bug72258.phpt | 26 | ||||
| -rw-r--r-- | ext/zip/tests/bug72258.zip | bin | 0 -> 110 bytes |
3 files changed, 59 insertions, 2 deletions
diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index db201af634..be35c2d2b1 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -1281,7 +1281,7 @@ static PHP_NAMED_FUNCTION(zif_zip_entry_read) } if (zr_rsrc->zf) { - buffer = zend_string_alloc(len, 0); + buffer = zend_string_safe_alloc(1, len, 0, 0); n = zip_fread(zr_rsrc->zf, ZSTR_VAL(buffer), ZSTR_LEN(buffer)); if (n > 0) { ZSTR_VAL(buffer)[n] = '\0'; @@ -2728,7 +2728,7 @@ static void php_zip_get_from(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */ RETURN_FALSE; } - buffer = zend_string_alloc(len, 0); + buffer = zend_string_safe_alloc(1, len, 0, 0); n = zip_fread(zf, ZSTR_VAL(buffer), ZSTR_LEN(buffer)); if (n < 1) { zend_string_free(buffer); @@ -3038,6 +3038,37 @@ static PHP_MINIT_FUNCTION(zip) REGISTER_ZIP_CLASS_CONST_LONG("FL_NODIR", ZIP_FL_NODIR); REGISTER_ZIP_CLASS_CONST_LONG("FL_COMPRESSED", ZIP_FL_COMPRESSED); REGISTER_ZIP_CLASS_CONST_LONG("FL_UNCHANGED", ZIP_FL_UNCHANGED); +#ifdef ZIP_FL_ENC_GUESS + /* Default filename encoding policy. */ + REGISTER_ZIP_CLASS_CONST_LONG("FL_ENC_GUESS", ZIP_FL_ENC_GUESS); +#endif +#ifdef ZIP_FL_ENC_RAW + REGISTER_ZIP_CLASS_CONST_LONG("FL_ENC_RAW", ZIP_FL_ENC_RAW); +#endif +#ifdef ZIP_FL_ENC_STRICT + REGISTER_ZIP_CLASS_CONST_LONG("FL_ENC_STRICT", ZIP_FL_ENC_STRICT); +#endif +#ifdef ZIP_FL_ENC_UTF_8 + REGISTER_ZIP_CLASS_CONST_LONG("FL_ENC_UTF_8", ZIP_FL_ENC_UTF_8); +#endif +#ifdef ZIP_FL_ENC_CP437 + REGISTER_ZIP_CLASS_CONST_LONG("FL_ENC_CP437", ZIP_FL_ENC_CP437); +#endif + +/* XXX The below are rather not implemented or to check whether makes sense to expose. */ +/*#ifdef ZIP_FL_RECOMPRESS + REGISTER_ZIP_CLASS_CONST_LONG("FL_RECOMPRESS", ZIP_FL_RECOMPRESS); +#endif +#ifdef ZIP_FL_ENCRYPTED + REGISTER_ZIP_CLASS_CONST_LONG("FL_ENCRYPTED", ZIP_FL_ENCRYPTED); +#endif +#ifdef ZIP_FL_LOCAL + REGISTER_ZIP_CLASS_CONST_LONG("FL_LOCAL", ZIP_FL_LOCAL); +#endif +#ifdef ZIP_FL_CENTRAL + REGISTER_ZIP_CLASS_CONST_LONG("FL_CENTRAL", ZIP_FL_CENTRAL); +#endif */ + REGISTER_ZIP_CLASS_CONST_LONG("CM_DEFAULT", ZIP_CM_DEFAULT); REGISTER_ZIP_CLASS_CONST_LONG("CM_STORE", ZIP_CM_STORE); REGISTER_ZIP_CLASS_CONST_LONG("CM_SHRINK", ZIP_CM_SHRINK); diff --git a/ext/zip/tests/bug72258.phpt b/ext/zip/tests/bug72258.phpt new file mode 100644 index 0000000000..87ba618450 --- /dev/null +++ b/ext/zip/tests/bug72258.phpt @@ -0,0 +1,26 @@ +--TEST-- +Bug #72258 ZipArchive converts filenames to unrecoverable form +--SKIPIF-- +<?php +/* $Id$ */ +if(!extension_loaded('zip')) die('skip'); +?> +--FILE-- +<?php + +$fn = dirname(__FILE__) . DIRECTORY_SEPARATOR . "bug72258.zip"; + +$zip = new \ZipArchive(); +$res = $zip->open($fn); +if ($res !== true) { + echo 'Error opening: ' . $res; + die(); +} + +for ($i = 0; $i < $zip->numFiles; $i++) { + $fnInArc = $zip->getNameIndex($i, ZipArchive::FL_ENC_RAW); + var_dump($fnInArc); +} +?> +--EXPECT-- +string(6) "/" diff --git a/ext/zip/tests/bug72258.zip b/ext/zip/tests/bug72258.zip Binary files differnew file mode 100644 index 0000000000..07ea2e4948 --- /dev/null +++ b/ext/zip/tests/bug72258.zip |
