From 169c5dc2b7a19d1fac7e9517dcffc58076ca6779 Mon Sep 17 00:00:00 2001 From: Pierre Joye Date: Mon, 7 Feb 2011 16:20:16 +0000 Subject: [PATCH] - Fixed bug #53893 (Wrong return value for ZipArchive::extractTo()) --- ext/zip/php_zip.c | 39 +++++++++++++++++++++++++++---------- ext/zip/tests/bug53603.phpt | 7 ++----- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index e5ffc874a1..c51d2f6aeb 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -235,6 +235,10 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil 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 +253,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) -- 2.40.0