summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre Joye <pajoye@php.net>2011-02-07 16:20:16 +0000
committerPierre Joye <pajoye@php.net>2011-02-07 16:20:16 +0000
commit5b521b71a2c58bc63e892981836414197b35c817 (patch)
tree4d7560e914b940423d67d29ced60ce000b5e785b
parent44b9942ef39bde2772d06108529b430a2d0c137c (diff)
downloadphp-git-5b521b71a2c58bc63e892981836414197b35c817.tar.gz
- Fixed bug #53893 (Wrong return value for ZipArchive::extractTo())
-rw-r--r--ext/zip/php_zip.c40
-rw-r--r--ext/zip/tests/bug53603.phpt7
2 files changed, 32 insertions, 15 deletions
diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c
index ec7c239162..078a9bc091 100644
--- a/ext/zip/php_zip.c
+++ b/ext/zip/php_zip.c
@@ -232,9 +232,14 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil
efree(file_dirname_fullpath);
efree(file_basename);
free(new_state.cwd);
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot build full extract path");
return 0;
} else if (len > MAXPATHLEN) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Full extraction path exceed MAXPATHLEN (%i)", MAXPATHLEN);
+ efree(file_dirname_fullpath);
+ efree(file_basename);
+ free(new_state.cwd);
+ return 0;
}
/* check again the full path, not sure if it
@@ -249,27 +254,42 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil
return 0;
}
+#if PHP_API_VERSION < 20100412
+ stream = php_stream_open_wrapper(fullpath, "w+b", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL);
+#else
+ stream = php_stream_open_wrapper(fullpath, "w+b", REPORT_ERRORS, NULL);
+#endif
+
+ if (stream == NULL) {
+ n = -1;
+ goto done;
+ }
+
zf = zip_fopen(za, file, 0);
if (zf == NULL) {
+ n = -1;
+ php_stream_close(stream);
+ goto done;
+ }
+
+ n = 0;
+ if (stream == NULL) {
+ int ret = zip_fclose(zf);
efree(fullpath);
- efree(file_dirname_fullpath);
efree(file_basename);
+ efree(file_dirname_fullpath);
free(new_state.cwd);
return 0;
}
-#if PHP_API_VERSION < 20100412
- stream = php_stream_open_wrapper(fullpath, "w+b", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL);
-#else
- stream = php_stream_open_wrapper(fullpath, "w+b", REPORT_ERRORS, NULL);
-#endif
- n = 0;
- if (stream) {
- while ((n=zip_fread(zf, b, sizeof(b))) > 0) php_stream_write(stream, b, n);
- php_stream_close(stream);
+ while ((n=zip_fread(zf, b, sizeof(b))) > 0) {
+ php_stream_write(stream, b, n);
}
+
+ php_stream_close(stream);
n = zip_fclose(zf);
+done:
efree(fullpath);
efree(file_basename);
efree(file_dirname_fullpath);
diff --git a/ext/zip/tests/bug53603.phpt b/ext/zip/tests/bug53603.phpt
index 7be20dc0e3..f8ff1b4d44 100644
--- a/ext/zip/tests/bug53603.phpt
+++ b/ext/zip/tests/bug53603.phpt
@@ -29,10 +29,7 @@ $a = $zip->extractTo('teststream://test');
var_dump($a);
--EXPECTF--
-Warning: ZipArchive::extractTo(teststream://test/foo): failed to open stream: "TestStream::stream_open" call failed in %s on line %d
-
-Warning: ZipArchive::extractTo(teststream://test/bar): failed to open stream: "TestStream::stream_open" call failed in %s on line %d
-Warning: ZipArchive::extractTo(teststream://test/foobar/baz): failed to open stream: "TestStream::stream_open" call failed in %s on line %d
-bool(true)
+Warning: ZipArchive::extractTo(teststream://test/foo): failed to open stream: "TestStream::stream_open" call failed in %s on line %d
+bool(false)