cellog Thu, 23 Jul 2009 17:04:24 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=284660
Log: fix PHP Bug #48377: error message unclear on converting phar with existing file Bug: http://bugs.php.net/48377 (Open) error message unclear on converting phar with existing file Changed paths: U pecl/phar/trunk/package.php U pecl/phar/trunk/phar_object.c A pecl/phar/trunk/tests/bug48377.2.phpt A pecl/phar/trunk/tests/bug48377.phpt U php/php-src/branches/PHP_5_3/NEWS U php/php-src/branches/PHP_5_3/ext/phar/phar_object.c A php/php-src/branches/PHP_5_3/ext/phar/tests/bug48377.2.phpt A php/php-src/branches/PHP_5_3/ext/phar/tests/bug48377.phpt U php/php-src/trunk/ext/phar/phar_object.c A php/php-src/trunk/ext/phar/tests/bug48377.2.phpt A php/php-src/trunk/ext/phar/tests/bug48377.phpt
Modified: pecl/phar/trunk/package.php =================================================================== --- pecl/phar/trunk/package.php 2009-07-23 16:40:47 UTC (rev 284659) +++ pecl/phar/trunk/package.php 2009-07-23 17:04:24 UTC (rev 284660) @@ -52,6 +52,7 @@ fixed PHP Bug #48783: make install will fail saying phar file exists fixed PHP Bug #48740: PHAR install fails when INSTALL_ROOT is not the final install location fixed PHP Bug #48681: openssl signature verification for tar archives broken + fixed PHP Bug #48377: error message unclear on converting phar with existing file fixed isset() on sub-directories (isset("blah") if file "blah/foo.php" exists) Changes since 2.0.0RC1: security vulnerability in handling of long tar filenames fixed Modified: pecl/phar/trunk/phar_object.c =================================================================== --- pecl/phar/trunk/phar_object.c 2009-07-23 16:40:47 UTC (rev 284659) +++ pecl/phar/trunk/phar_object.c 2009-07-23 17:04:24 UTC (rev 284660) @@ -2043,6 +2043,7 @@ int ext_len = ext ? strlen(ext) : 0; int oldname_len; phar_archive_data **pphar = NULL; + php_stream_statbuf ssb; if (!ext) { if (phar->is_zip) { @@ -2113,6 +2114,8 @@ spprintf(&newname, 0, "%s.%s", strtok(basename, "."), ext); efree(basename); + + basepath = estrndup(oldpath, (strlen(oldpath) - oldname_len)); phar->fname_len = spprintf(&newpath, 0, "%s%s", basepath, newname); phar->fname = newpath; @@ -2148,6 +2151,11 @@ return NULL; } its_ok: + if (SUCCESS == php_stream_stat_path(newpath, &ssb)) { + efree(oldpath); + zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "phar \"%s\" exists and must be unlinked prior to conversion", newpath); + return NULL; + } if (!phar->is_data) { if (SUCCESS != phar_detect_phar_fname_ext(newpath, phar->fname_len, (const char **) &(phar->ext), &(phar->ext_len), 1, 1, 1 TSRMLS_CC)) { efree(oldpath); Added: pecl/phar/trunk/tests/bug48377.2.phpt =================================================================== --- pecl/phar/trunk/tests/bug48377.2.phpt (rev 0) +++ pecl/phar/trunk/tests/bug48377.2.phpt 2009-07-23 17:04:24 UTC (rev 284660) @@ -0,0 +1,25 @@ +--TEST-- +Phar: PHP bug #48377 "error message unclear on converting phar with existing file" test #2 +--SKIPIF-- +<?php if (!extension_loaded("phar")) die("skip"); ?> +--INI-- +phar.require_hash=0 +phar.readonly=0 +--FILE-- +<?php +$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.zip'; + +$phar = new PharData($fname); +$phar['x'] = 'hi'; +try { + $phar->convertToData(Phar::ZIP, Phar::NONE, '.2.phar.zip'); +} catch (BadMethodCallException $e) { + echo $e->getMessage(),"\n"; +} +?> +===DONE=== +--CLEAN-- +<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.zip');?> +--EXPECTF-- +data phar "%sbug48377.2.phar.zip" has invalid extension 2.phar.zip +===DONE=== \ No newline at end of file Added: pecl/phar/trunk/tests/bug48377.phpt =================================================================== --- pecl/phar/trunk/tests/bug48377.phpt (rev 0) +++ pecl/phar/trunk/tests/bug48377.phpt 2009-07-23 17:04:24 UTC (rev 284660) @@ -0,0 +1,29 @@ +--TEST-- +Phar: PHP bug #48377 "error message unclear on converting phar with existing file" +--SKIPIF-- +<?php if (!extension_loaded("phar")) die("skip"); ?> +--INI-- +phar.require_hash=0 +phar.readonly=0 +--FILE-- +<?php +$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar'; +$fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.zip'; + +touch($fname2); + +$phar = new Phar($fname, 0, 'a.phar'); +$phar['x'] = 'hi'; +try { + $phar->convertToData(Phar::ZIP, Phar::NONE, 'zip'); +} catch (BadMethodCallException $e) { + echo $e->getMessage(),"\n"; +} +?> +===DONE=== +--CLEAN-- +<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar');?> +<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.zip');?> +--EXPECTF-- +phar "%sbug48377.zip" exists and must be unlinked prior to conversion +===DONE=== \ No newline at end of file Modified: php/php-src/branches/PHP_5_3/NEWS =================================================================== --- php/php-src/branches/PHP_5_3/NEWS 2009-07-23 16:40:47 UTC (rev 284659) +++ php/php-src/branches/PHP_5_3/NEWS 2009-07-23 17:04:24 UTC (rev 284660) @@ -43,6 +43,8 @@ components). (Ilia) - Fixed bug #48681 (openssl signature verification for tar archives broken). (Greg) +- Fixed bug #48377 (error message unclear on converting phar with existing file). + (Greg) - Fixed bug #48247 (Infinite loop and possible crash during startup with errors when errors are logged). (Jani) - Fixed bug #48116 (Fixed build with Openssl 1.0). (Pierre, Modified: php/php-src/branches/PHP_5_3/ext/phar/phar_object.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/phar/phar_object.c 2009-07-23 16:40:47 UTC (rev 284659) +++ php/php-src/branches/PHP_5_3/ext/phar/phar_object.c 2009-07-23 17:04:24 UTC (rev 284660) @@ -2037,6 +2037,7 @@ int ext_len = ext ? strlen(ext) : 0; int oldname_len; phar_archive_data **pphar = NULL; + php_stream_statbuf ssb; if (!ext) { if (phar->is_zip) { @@ -2107,6 +2108,8 @@ spprintf(&newname, 0, "%s.%s", strtok(basename, "."), ext); efree(basename); + + basepath = estrndup(oldpath, (strlen(oldpath) - oldname_len)); phar->fname_len = spprintf(&newpath, 0, "%s%s", basepath, newname); phar->fname = newpath; @@ -2142,6 +2145,11 @@ return NULL; } its_ok: + if (SUCCESS == php_stream_stat_path(newpath, &ssb)) { + efree(oldpath); + zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "phar \"%s\" exists and must be unlinked prior to conversion", newpath); + return NULL; + } if (!phar->is_data) { if (SUCCESS != phar_detect_phar_fname_ext(newpath, phar->fname_len, (const char **) &(phar->ext), &(phar->ext_len), 1, 1, 1 TSRMLS_CC)) { efree(oldpath); Added: php/php-src/branches/PHP_5_3/ext/phar/tests/bug48377.2.phpt =================================================================== --- php/php-src/branches/PHP_5_3/ext/phar/tests/bug48377.2.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/ext/phar/tests/bug48377.2.phpt 2009-07-23 17:04:24 UTC (rev 284660) @@ -0,0 +1,25 @@ +--TEST-- +Phar: PHP bug #48377 "error message unclear on converting phar with existing file" test #2 +--SKIPIF-- +<?php if (!extension_loaded("phar")) die("skip"); ?> +--INI-- +phar.require_hash=0 +phar.readonly=0 +--FILE-- +<?php +$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.zip'; + +$phar = new PharData($fname); +$phar['x'] = 'hi'; +try { + $phar->convertToData(Phar::ZIP, Phar::NONE, '.2.phar.zip'); +} catch (BadMethodCallException $e) { + echo $e->getMessage(),"\n"; +} +?> +===DONE=== +--CLEAN-- +<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.zip');?> +--EXPECTF-- +data phar "%sbug48377.2.phar.zip" has invalid extension 2.phar.zip +===DONE=== \ No newline at end of file Added: php/php-src/branches/PHP_5_3/ext/phar/tests/bug48377.phpt =================================================================== --- php/php-src/branches/PHP_5_3/ext/phar/tests/bug48377.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/ext/phar/tests/bug48377.phpt 2009-07-23 17:04:24 UTC (rev 284660) @@ -0,0 +1,29 @@ +--TEST-- +Phar: PHP bug #48377 "error message unclear on converting phar with existing file" +--SKIPIF-- +<?php if (!extension_loaded("phar")) die("skip"); ?> +--INI-- +phar.require_hash=0 +phar.readonly=0 +--FILE-- +<?php +$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar'; +$fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.zip'; + +touch($fname2); + +$phar = new Phar($fname, 0, 'a.phar'); +$phar['x'] = 'hi'; +try { + $phar->convertToData(Phar::ZIP, Phar::NONE, 'zip'); +} catch (BadMethodCallException $e) { + echo $e->getMessage(),"\n"; +} +?> +===DONE=== +--CLEAN-- +<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar');?> +<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.zip');?> +--EXPECTF-- +phar "%sbug48377.zip" exists and must be unlinked prior to conversion +===DONE=== \ No newline at end of file Modified: php/php-src/trunk/ext/phar/phar_object.c =================================================================== --- php/php-src/trunk/ext/phar/phar_object.c 2009-07-23 16:40:47 UTC (rev 284659) +++ php/php-src/trunk/ext/phar/phar_object.c 2009-07-23 17:04:24 UTC (rev 284660) @@ -2037,6 +2037,7 @@ int ext_len = ext ? strlen(ext) : 0; int oldname_len; phar_archive_data **pphar = NULL; + php_stream_statbuf ssb; if (!ext) { if (phar->is_zip) { @@ -2107,6 +2108,8 @@ spprintf(&newname, 0, "%s.%s", strtok(basename, "."), ext); efree(basename); + + basepath = estrndup(oldpath, (strlen(oldpath) - oldname_len)); phar->fname_len = spprintf(&newpath, 0, "%s%s", basepath, newname); phar->fname = newpath; @@ -2142,6 +2145,11 @@ return NULL; } its_ok: + if (SUCCESS == php_stream_stat_path(newpath, &ssb)) { + efree(oldpath); + zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "phar \"%s\" exists and must be unlinked prior to conversion", newpath); + return NULL; + } if (!phar->is_data) { if (SUCCESS != phar_detect_phar_fname_ext(newpath, phar->fname_len, (const char **) &(phar->ext), &(phar->ext_len), 1, 1, 1 TSRMLS_CC)) { efree(oldpath); Added: php/php-src/trunk/ext/phar/tests/bug48377.2.phpt =================================================================== --- php/php-src/trunk/ext/phar/tests/bug48377.2.phpt (rev 0) +++ php/php-src/trunk/ext/phar/tests/bug48377.2.phpt 2009-07-23 17:04:24 UTC (rev 284660) @@ -0,0 +1,25 @@ +--TEST-- +Phar: PHP bug #48377 "error message unclear on converting phar with existing file" test #2 +--SKIPIF-- +<?php if (!extension_loaded("phar")) die("skip"); ?> +--INI-- +phar.require_hash=0 +phar.readonly=0 +--FILE-- +<?php +$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.zip'; + +$phar = new PharData($fname); +$phar['x'] = 'hi'; +try { + $phar->convertToData(Phar::ZIP, Phar::NONE, '.2.phar.zip'); +} catch (BadMethodCallException $e) { + echo $e->getMessage(),"\n"; +} +?> +===DONE=== +--CLEAN-- +<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.zip');?> +--EXPECTF-- +data phar "%sbug48377.2.phar.zip" has invalid extension 2.phar.zip +===DONE=== \ No newline at end of file Added: php/php-src/trunk/ext/phar/tests/bug48377.phpt =================================================================== --- php/php-src/trunk/ext/phar/tests/bug48377.phpt (rev 0) +++ php/php-src/trunk/ext/phar/tests/bug48377.phpt 2009-07-23 17:04:24 UTC (rev 284660) @@ -0,0 +1,29 @@ +--TEST-- +Phar: PHP bug #48377 "error message unclear on converting phar with existing file" +--SKIPIF-- +<?php if (!extension_loaded("phar")) die("skip"); ?> +--INI-- +phar.require_hash=0 +phar.readonly=0 +--FILE-- +<?php +$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar'; +$fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.zip'; + +touch($fname2); + +$phar = new Phar($fname, 0, 'a.phar'); +$phar['x'] = 'hi'; +try { + $phar->convertToData(Phar::ZIP, Phar::NONE, 'zip'); +} catch (BadMethodCallException $e) { + echo $e->getMessage(),"\n"; +} +?> +===DONE=== +--CLEAN-- +<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar');?> +<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.zip');?> +--EXPECTF-- +phar "%sbug48377.zip" exists and must be unlinked prior to conversion +===DONE=== \ No newline at end of file
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php