Skip to content

Commit ab3052a

Browse files
committed
Merge branch 'PHP-7.4' into PHP-8.0
* PHP-7.4: Fix #80863: ZipArchive::extractTo() ignores references
2 parents f547bdd + 57918b1 commit ab3052a

File tree

3 files changed

+48
-2
lines changed

3 files changed

+48
-2
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ PHP NEWS
3939
- XMLReader:
4040
. Fixed bug #73246 (XMLReader: encoding length not checked). (cmb)
4141

42+
- Zip:
43+
. Fixed bug #80863 (ZipArchive::extractTo() ignores references). (cmb)
44+
4245
06 May 2021, PHP 8.0.6
4346

4447
- PDO_pgsql:

ext/zip/php_zip.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2719,7 +2719,6 @@ PHP_METHOD(ZipArchive, extractTo)
27192719
zend_string *files_str = NULL;
27202720
HashTable *files_ht = NULL;
27212721

2722-
zval *zval_file = NULL;
27232722
php_stream_statbuf ssb;
27242723
char *pathto;
27252724
size_t pathto_len;
@@ -2756,7 +2755,8 @@ PHP_METHOD(ZipArchive, extractTo)
27562755
RETURN_FALSE;
27572756
}
27582757
for (i = 0; i < nelems; i++) {
2759-
if ((zval_file = zend_hash_index_find(files_ht, i)) != NULL) {
2758+
zval *zval_file;
2759+
if ((zval_file = zend_hash_index_find_deref(Z_ARRVAL_P(zval_files), i)) != NULL) {
27602760
switch (Z_TYPE_P(zval_file)) {
27612761
case IS_LONG:
27622762
break;

ext/zip/tests/bug80863.phpt

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
--TEST--
2+
Bug #80863 (ZipArchive::extractTo() ignores references)
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('zip')) die("skip zip extension not available");
6+
?>
7+
--FILE--
8+
<?php
9+
$archive = __DIR__ . "/bug80863.zip";
10+
11+
$zip = new ZipArchive();
12+
$zip->open($archive, ZipArchive::CREATE | ZipArchive::OVERWRITE);
13+
$zip->addFromString("file1.txt", "contents");
14+
$zip->addFromString("file2.txt", "contents");
15+
$zip->close();
16+
17+
$target = __DIR__ . "/bug80683";
18+
mkdir($target);
19+
20+
$files = [
21+
"file1.txt",
22+
"file2.txt",
23+
];
24+
// turn into references
25+
foreach ($files as &$file);
26+
27+
$zip = new ZipArchive();
28+
$zip->open($archive);
29+
$zip->extractTo($target, $files);
30+
var_dump(is_file("$target/file1.txt"));
31+
var_dump(is_file("$target/file2.txt"));
32+
?>
33+
--EXPECT--
34+
bool(true)
35+
bool(true)
36+
--CLEAN--
37+
<?php
38+
@unlink(__DIR__ . "/bug80863.zip");
39+
$target = __DIR__ . "/bug80683";
40+
@unlink("$target/file1.txt");
41+
@unlink("$target/file2.txt");
42+
@rmdir($target);
43+
?>

0 commit comments

Comments
 (0)