diff options
author | Pierre Joye <pajoye@php.net> | 2011-02-07 16:20:16 +0000 |
---|---|---|
committer | Pierre Joye <pajoye@php.net> | 2011-02-07 16:20:16 +0000 |
commit | 169c5dc2b7a19d1fac7e9517dcffc58076ca6779 (patch) | |
tree | 913bd8a07fe434d8b0cf2596e4017da9446905eb /ext/zip/php_zip.c | |
parent | a0a603d16b7b6b1a7d2b05effae89b1e11c7e67e (diff) | |
download | php-git-169c5dc2b7a19d1fac7e9517dcffc58076ca6779.tar.gz |
- Fixed bug #53893 (Wrong return value for ZipArchive::extractTo())
Diffstat (limited to 'ext/zip/php_zip.c')
-rw-r--r-- | ext/zip/php_zip.c | 39 |
1 files changed, 29 insertions, 10 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); |