diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 3063cd93336..f06043ed273 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -2728,7 +2728,6 @@ PHP_METHOD(ZipArchive, extractTo) zend_string *files_str = NULL; HashTable *files_ht = NULL; - zval *zval_file = NULL; php_stream_statbuf ssb; char *pathto; size_t pathto_len; @@ -2765,7 +2764,8 @@ PHP_METHOD(ZipArchive, extractTo) RETURN_FALSE; } for (i = 0; i < nelems; i++) { - if ((zval_file = zend_hash_index_find(files_ht, i)) != NULL) { + zval *zval_file; + if ((zval_file = zend_hash_index_find_deref(Z_ARRVAL_P(zval_files), i)) != NULL) { switch (Z_TYPE_P(zval_file)) { case IS_LONG: break; diff --git a/ext/zip/tests/bug80863.phpt b/ext/zip/tests/bug80863.phpt new file mode 100644 index 00000000000..9b9d3b2ff39 --- /dev/null +++ b/ext/zip/tests/bug80863.phpt @@ -0,0 +1,43 @@ +--TEST-- +Bug #80863 (ZipArchive::extractTo() ignores references) +--SKIPIF-- + +--FILE-- +open($archive, ZipArchive::CREATE | ZipArchive::OVERWRITE); +$zip->addFromString("file1.txt", "contents"); +$zip->addFromString("file2.txt", "contents"); +$zip->close(); + +$target = __DIR__ . "/bug80683"; +mkdir($target); + +$files = [ + "file1.txt", + "file2.txt", +]; +// turn into references +foreach ($files as &$file); + +$zip = new ZipArchive(); +$zip->open($archive); +$zip->extractTo($target, $files); +var_dump(is_file("$target/file1.txt")); +var_dump(is_file("$target/file2.txt")); +?> +--EXPECT-- +bool(true) +bool(true) +--CLEAN-- +