pajoye                                   Mon, 07 Feb 2011 16:20:16 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=308107

Log:
- Fixed bug #53893 (Wrong return value for ZipArchive::extractTo())

Bug: http://bugs.php.net/53893 (Open) Wrong return value for 
ZipArchive::extractTo()
      
Changed paths:
    U   php/php-src/branches/PHP_5_3/ext/zip/php_zip.c
    U   php/php-src/branches/PHP_5_3/ext/zip/tests/bug53603.phpt
    U   php/php-src/trunk/ext/zip/php_zip.c
    U   php/php-src/trunk/ext/zip/tests/bug53603.phpt

Modified: php/php-src/branches/PHP_5_3/ext/zip/php_zip.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/zip/php_zip.c      2011-02-07 16:08:44 UTC 
(rev 308106)
+++ php/php-src/branches/PHP_5_3/ext/zip/php_zip.c      2011-02-07 16:20:16 UTC 
(rev 308107)
@@ -232,9 +232,14 @@
                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 @@
                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_basename);
                efree(file_dirname_fullpath);
-               efree(file_basename);
                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);

Modified: php/php-src/branches/PHP_5_3/ext/zip/tests/bug53603.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/zip/tests/bug53603.phpt    2011-02-07 
16:08:44 UTC (rev 308106)
+++ php/php-src/branches/PHP_5_3/ext/zip/tests/bug53603.phpt    2011-02-07 
16:20:16 UTC (rev 308107)
@@ -29,10 +29,7 @@
 var_dump($a);

 --EXPECTF--
+
 Warning: ZipArchive::extractTo(teststream://test/foo): failed to open stream: 
"TestStream::stream_open" call failed in %s on line %d
+bool(false)

-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)
-

Modified: php/php-src/trunk/ext/zip/php_zip.c
===================================================================
--- php/php-src/trunk/ext/zip/php_zip.c 2011-02-07 16:08:44 UTC (rev 308106)
+++ php/php-src/trunk/ext/zip/php_zip.c 2011-02-07 16:20:16 UTC (rev 308107)
@@ -235,6 +235,10 @@
                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 @@
                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_basename);
                efree(file_dirname_fullpath);
-               efree(file_basename);
                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);

Modified: php/php-src/trunk/ext/zip/tests/bug53603.phpt
===================================================================
--- php/php-src/trunk/ext/zip/tests/bug53603.phpt       2011-02-07 16:08:44 UTC 
(rev 308106)
+++ php/php-src/trunk/ext/zip/tests/bug53603.phpt       2011-02-07 16:20:16 UTC 
(rev 308107)
@@ -29,10 +29,7 @@
 var_dump($a);

 --EXPECTF--
+
 Warning: ZipArchive::extractTo(teststream://test/foo): failed to open stream: 
"TestStream::stream_open" call failed in %s on line %d
+bool(false)

-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)
-

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to