From 0d7b46cda76f06efe0d17f68ed1e6f016bf5b94b Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Fri, 10 Apr 2026 17:21:52 +0800 Subject: [PATCH 1/4] fix 21705 --- ext/zip/php_zip.c | 2 +- ...rchive_getFromIndex_unchanged_deleted.phpt | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 ext/zip/tests/ZipArchive_getFromIndex_unchanged_deleted.phpt diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 5194eaa0df0e..e6965825d59c 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -2788,7 +2788,7 @@ static void php_zip_get_from(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */ ZIP_FROM_OBJECT(intern, self); - PHP_ZIP_STAT_INDEX(intern, index, 0, sb); + PHP_ZIP_STAT_INDEX(intern, index, flags, sb); } if (sb.size < 1) { diff --git a/ext/zip/tests/ZipArchive_getFromIndex_unchanged_deleted.phpt b/ext/zip/tests/ZipArchive_getFromIndex_unchanged_deleted.phpt new file mode 100644 index 000000000000..595cf5556ef0 --- /dev/null +++ b/ext/zip/tests/ZipArchive_getFromIndex_unchanged_deleted.phpt @@ -0,0 +1,41 @@ +--TEST-- +ZipArchive::getFromIndex() honors FL_UNCHANGED for deleted entries +--EXTENSIONS-- +zip +--FILE-- +open($name, ZipArchive::CREATE)); +var_dump($zip->addFromString('foo.txt', 'foo')); +var_dump($zip->addFromString('bar.txt', 'bar')); +var_dump($zip->close()); + +$zip = new ZipArchive; +var_dump($zip->open($name)); +$index = $zip->locateName('bar.txt'); +var_dump($index); +var_dump($zip->deleteName('bar.txt')); + +var_dump($zip->getFromName('bar.txt', 0, ZipArchive::FL_UNCHANGED)); +var_dump($zip->getFromIndex($index, 0, ZipArchive::FL_UNCHANGED)); + +var_dump($zip->close()); +?> +--CLEAN-- + +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +int(1) +bool(true) +string(3) "bar" +string(3) "bar" +bool(true) From dd45a0b149b499483d3919c1ce1acd5661db1e74 Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Fri, 10 Apr 2026 17:31:25 +0800 Subject: [PATCH 2/4] make test simpler --- ...rchive_getFromIndex_unchanged_deleted.phpt | 41 ------------------- ext/zip/tests/bug21705.phpt | 29 +++++++++++++ 2 files changed, 29 insertions(+), 41 deletions(-) delete mode 100644 ext/zip/tests/ZipArchive_getFromIndex_unchanged_deleted.phpt create mode 100644 ext/zip/tests/bug21705.phpt diff --git a/ext/zip/tests/ZipArchive_getFromIndex_unchanged_deleted.phpt b/ext/zip/tests/ZipArchive_getFromIndex_unchanged_deleted.phpt deleted file mode 100644 index 595cf5556ef0..000000000000 --- a/ext/zip/tests/ZipArchive_getFromIndex_unchanged_deleted.phpt +++ /dev/null @@ -1,41 +0,0 @@ ---TEST-- -ZipArchive::getFromIndex() honors FL_UNCHANGED for deleted entries ---EXTENSIONS-- -zip ---FILE-- -open($name, ZipArchive::CREATE)); -var_dump($zip->addFromString('foo.txt', 'foo')); -var_dump($zip->addFromString('bar.txt', 'bar')); -var_dump($zip->close()); - -$zip = new ZipArchive; -var_dump($zip->open($name)); -$index = $zip->locateName('bar.txt'); -var_dump($index); -var_dump($zip->deleteName('bar.txt')); - -var_dump($zip->getFromName('bar.txt', 0, ZipArchive::FL_UNCHANGED)); -var_dump($zip->getFromIndex($index, 0, ZipArchive::FL_UNCHANGED)); - -var_dump($zip->close()); -?> ---CLEAN-- - ---EXPECT-- -bool(true) -bool(true) -bool(true) -bool(true) -bool(true) -int(1) -bool(true) -string(3) "bar" -string(3) "bar" -bool(true) diff --git a/ext/zip/tests/bug21705.phpt b/ext/zip/tests/bug21705.phpt new file mode 100644 index 000000000000..0307ada6fec6 --- /dev/null +++ b/ext/zip/tests/bug21705.phpt @@ -0,0 +1,29 @@ +--TEST-- +ZipArchive::getFromIndex() honors FL_UNCHANGED for deleted entries +--EXTENSIONS-- +zip +--FILE-- +open($name, ZipArchive::CREATE); +$zip->addFromString('foo.txt', 'foo'); +$zip->addFromString('bar.txt', 'bar'); +$zip->close(); + +$zip = new ZipArchive; +$zip->open($name); + +$index = $zip->locateName('bar.txt'); +$zip->deleteName('bar.txt'); + +var_dump($zip->getFromName('bar.txt', 0, ZipArchive::FL_UNCHANGED)); +var_dump($zip->getFromIndex($index, 0, ZipArchive::FL_UNCHANGED)); // the ZipArchive::FL_UNCHANGED is ignored + +$zip->close(); +@unlink($name); +?> +--EXPECT-- +string(3) "bar" +string(3) "bar" From 27b6f183cd6ef5435fb1d7facc2b126fb6f333a2 Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Fri, 10 Apr 2026 17:43:07 +0800 Subject: [PATCH 3/4] rename test file --- ext/zip/tests/{bug21705.phpt => bug_gh21705.phpt} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename ext/zip/tests/{bug21705.phpt => bug_gh21705.phpt} (93%) diff --git a/ext/zip/tests/bug21705.phpt b/ext/zip/tests/bug_gh21705.phpt similarity index 93% rename from ext/zip/tests/bug21705.phpt rename to ext/zip/tests/bug_gh21705.phpt index 0307ada6fec6..d96678a154ce 100644 --- a/ext/zip/tests/bug21705.phpt +++ b/ext/zip/tests/bug_gh21705.phpt @@ -19,7 +19,7 @@ $index = $zip->locateName('bar.txt'); $zip->deleteName('bar.txt'); var_dump($zip->getFromName('bar.txt', 0, ZipArchive::FL_UNCHANGED)); -var_dump($zip->getFromIndex($index, 0, ZipArchive::FL_UNCHANGED)); // the ZipArchive::FL_UNCHANGED is ignored +var_dump($zip->getFromIndex($index, 0, ZipArchive::FL_UNCHANGED)); $zip->close(); @unlink($name); From 9bcc99b6861c541ed6bf3ee51a225ecf432ad87e Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Fri, 10 Apr 2026 18:07:00 +0800 Subject: [PATCH 4/4] add cleanups --- ext/zip/tests/bug_gh21705.phpt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ext/zip/tests/bug_gh21705.phpt b/ext/zip/tests/bug_gh21705.phpt index d96678a154ce..41dabb224510 100644 --- a/ext/zip/tests/bug_gh21705.phpt +++ b/ext/zip/tests/bug_gh21705.phpt @@ -4,7 +4,7 @@ ZipArchive::getFromIndex() honors FL_UNCHANGED for deleted entries zip --FILE-- open($name, ZipArchive::CREATE); @@ -22,6 +22,10 @@ var_dump($zip->getFromName('bar.txt', 0, ZipArchive::FL_UNCHANGED)); var_dump($zip->getFromIndex($index, 0, ZipArchive::FL_UNCHANGED)); $zip->close(); +?> +--CLEAN-- + --EXPECT--