summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2013-04-10 20:40:28 +0200
committerAnatol Belski <ab@php.net>2013-04-10 20:40:28 +0200
commitceb5b684e09df93e6061b1308c91a3d311608cff (patch)
tree9e08a2b439874bbd030c5966aafd213077512b2d
parent442ff25187081212631c03a49041a0529520b505 (diff)
parent968ae4a56a08587d73f81f30a0d57fbd109e4cf4 (diff)
downloadphp-git-ceb5b684e09df93e6061b1308c91a3d311608cff.tar.gz
Merge branch 'PHP-5.3' into PHP-5.4
* PHP-5.3: Fixed bug #64342 ZipArchive::addFile() has to check for file existence
-rw-r--r--ext/zip/php_zip.c7
-rw-r--r--ext/zip/tests/bug64342_0.phpt42
-rw-r--r--ext/zip/tests/bug64342_1.phpt37
3 files changed, 86 insertions, 0 deletions
diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c
index 727cc853ca..0c033d4e46 100644
--- a/ext/zip/php_zip.c
+++ b/ext/zip/php_zip.c
@@ -28,6 +28,7 @@
#include "ext/standard/file.h"
#include "ext/standard/php_string.h"
#include "ext/pcre/php_pcre.h"
+#include "ext/standard/php_filestat.h"
#include "php_zip.h"
#include "lib/zip.h"
#include "lib/zipint.h"
@@ -300,6 +301,7 @@ static int php_zip_add_file(struct zip *za, const char *filename, size_t filenam
struct zip_source *zs;
int cur_idx;
char resolved_path[MAXPATHLEN];
+ zval exists_flag;
if (ZIP_OPENBASEDIR_CHECKPATH(filename)) {
@@ -310,6 +312,11 @@ static int php_zip_add_file(struct zip *za, const char *filename, size_t filenam
return -1;
}
+ php_stat(resolved_path, strlen(resolved_path), FS_EXISTS, &exists_flag TSRMLS_CC);
+ if (!Z_BVAL(exists_flag)) {
+ return -1;
+ }
+
zs = zip_source_file(za, resolved_path, offset_start, offset_len);
if (!zs) {
return -1;
diff --git a/ext/zip/tests/bug64342_0.phpt b/ext/zip/tests/bug64342_0.phpt
new file mode 100644
index 0000000000..066d3e6fc2
--- /dev/null
+++ b/ext/zip/tests/bug64342_0.phpt
@@ -0,0 +1,42 @@
+--TEST--
+Bug #64342 ZipArchive::addFile() has to check file existance (variation 1)
+--SKIPIF--
+<?php
+ if(!extension_loaded('zip')) die('skip');
+?>
+--FILE--
+<?php
+
+$zip = new ZipArchive;
+$res = $zip->open(dirname(__FILE__) . '/bug64342.zip', ZipArchive::CREATE);
+if ($res === TRUE) {
+ $f = md5(uniqid()) . '.txt';
+ echo "$f\n";
+ $res = $zip->addFile($f);
+ if (true == $res) {
+ echo "add ok\n";
+ } else {
+ echo "add failed\n";
+ }
+ $res = $zip->close();
+ if (true == $res) {
+ echo "close ok\n";
+ } else {
+ echo "close failed\n";
+ }
+} else {
+ echo "open failed\n";
+}
+
+
+?>
+DONE
+--CLEAN--
+<?php
+
+@unlink(dirname(__FILE__) . '/bug64342.zip');
+--EXPECTF--
+%s.txt
+add failed
+close ok
+DONE
diff --git a/ext/zip/tests/bug64342_1.phpt b/ext/zip/tests/bug64342_1.phpt
new file mode 100644
index 0000000000..2b1357d12f
--- /dev/null
+++ b/ext/zip/tests/bug64342_1.phpt
@@ -0,0 +1,37 @@
+--TEST--
+Bug #64342 ZipArchive::addFile() has to check file existance (variation 2)
+--SKIPIF--
+<?php
+/* $Id$ */
+if(!extension_loaded('zip')) die('skip');
+?>
+--FILE--
+<?php
+
+$dirname = dirname(__FILE__) . '/';
+include $dirname . 'utils.inc';
+$file = $dirname . '__tmp_oo_addfile.zip';
+
+copy($dirname . 'test.zip', $file);
+
+$zip = new ZipArchive;
+if (!$zip->open($file)) {
+ exit('failed');
+}
+if (!$zip->addFile($dirname . 'cant_find_me.txt', 'test.php')) {
+ echo "failed\n";
+}
+if ($zip->status == ZIPARCHIVE::ER_OK) {
+ dump_entries_name($zip);
+ $zip->close();
+} else {
+ echo "failed\n";
+}
+@unlink($file);
+?>
+--EXPECTF--
+failed
+0 bar
+1 foobar/
+2 foobar/baz
+3 entry1.txt