summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS4
-rw-r--r--ext/zip/php_zip.c12
-rw-r--r--ext/zip/tests/bug70752.phpt31
-rw-r--r--ext/zip/tests/bug70752.zipbin0 -> 175 bytes
4 files changed, 41 insertions, 6 deletions
diff --git a/NEWS b/NEWS
index 70fd86b8c2..764ba49e58 100644
--- a/NEWS
+++ b/NEWS
@@ -29,6 +29,10 @@ PHP NEWS
. Fixed bug #71882 (Negative ftruncate() on php://memory exhausts memory).
(cmb)
+- Zip:
+ . Fixed bug #70752 (Depacking with wrong password leaves 0 length files).
+ (cmb)
+
15 Sep 2016 PHP 7.0.11
- Core:
diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c
index b9f0bb73ac..cfac566506 100644
--- a/ext/zip/php_zip.c
+++ b/ext/zip/php_zip.c
@@ -238,17 +238,17 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil
return 0;
}
- stream = php_stream_open_wrapper(fullpath, "w+b", REPORT_ERRORS, NULL);
-
- if (stream == NULL) {
+ zf = zip_fopen(za, file, 0);
+ if (zf == NULL) {
n = -1;
goto done;
}
- zf = zip_fopen(za, file, 0);
- if (zf == NULL) {
+ stream = php_stream_open_wrapper(fullpath, "w+b", REPORT_ERRORS, NULL);
+
+ if (stream == NULL) {
n = -1;
- php_stream_close(stream);
+ zip_fclose(zf);
goto done;
}
diff --git a/ext/zip/tests/bug70752.phpt b/ext/zip/tests/bug70752.phpt
new file mode 100644
index 0000000000..f006fbee9a
--- /dev/null
+++ b/ext/zip/tests/bug70752.phpt
@@ -0,0 +1,31 @@
+--TEST--
+Bug #70752 (Depacking with wrong password leaves 0 length files)
+--SKIPIF--
+<?php
+if (!extension_loaded('zip')) die('skip zip extension not available');
+?>
+--FILE--
+<?php
+$filename = __DIR__ . DIRECTORY_SEPARATOR . 'bug70752.zip';
+$zip = new ZipArchive();
+$zip->open($filename);
+
+$filename = __DIR__ . DIRECTORY_SEPARATOR . 'bug70752.txt';
+var_dump(file_exists($filename));
+
+$zip->setPassword('bar'); // correct password would be 'foo'
+$zip->extractTo(__DIR__);
+$zip->close();
+
+var_dump(file_exists($filename));
+?>
+===DONE===
+--EXPECT--
+bool(false)
+bool(false)
+===DONE===
+--CLEAN--
+<?php
+$filename = __DIR__ . DIRECTORY_SEPARATOR . 'bug70752.txt';
+unlink($filename);
+?>
diff --git a/ext/zip/tests/bug70752.zip b/ext/zip/tests/bug70752.zip
new file mode 100644
index 0000000000..9bec61bc18
--- /dev/null
+++ b/ext/zip/tests/bug70752.zip
Binary files differ