diff options
author | Greg Beaver <cellog@php.net> | 2007-08-23 23:23:26 +0000 |
---|---|---|
committer | Greg Beaver <cellog@php.net> | 2007-08-23 23:23:26 +0000 |
commit | 5178a945459ec587bad6361f453ada43e87f8f8d (patch) | |
tree | a47f3b2642b0f82fb350f0d07fe21da6018d8d6f | |
parent | e02bd088893894ec5f84a05c16d9a6a3480879a8 (diff) | |
download | php-git-5178a945459ec587bad6361f453ada43e87f8f8d.tar.gz |
add test for pre-existing alias failure, fix source to fail if alias already exists
-rw-r--r-- | ext/phar/package.xml | 1 | ||||
-rwxr-xr-x | ext/phar/phar_object.c | 9 | ||||
-rw-r--r-- | ext/phar/tests/phar_setalias2.phpt | 43 |
3 files changed, 53 insertions, 0 deletions
diff --git a/ext/phar/package.xml b/ext/phar/package.xml index 1b459f334f..e015a443fd 100644 --- a/ext/phar/package.xml +++ b/ext/phar/package.xml @@ -155,6 +155,7 @@ avaiable then SHA-256 and SHA-512 signatures are supported as well.</description <file name="phar_oo_test.inc" role="test" /> <file name="phar_oo_uncompressall.phpt" role="test" /> <file name="phar_setalias.phpt" role="test" /> + <file name="phar_setalias2.phpt" role="test" /> <file name="phar_setsignaturealgo1.phpt" role="test" /> <file name="phar_setsignaturealgo2.phpt" role="test" /> <file name="phar_stub.phpt" role="test" /> diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index 85375441c0..124c471a87 100755 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -310,6 +310,15 @@ PHP_METHOD(Phar, setAlias) int alias_len; PHAR_ARCHIVE_OBJECT(); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &alias, &alias_len) == SUCCESS) { + if (alias_len == phar_obj->arc.archive->alias_len && memcmp(phar_obj->arc.archive->alias, alias, alias_len) == 0) { + RETURN_TRUE; + } + if (SUCCESS == zend_hash_find(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len, (void**)&fd_ptr)) { + spprintf(&error, 0, "alias \"%s\" is already used for archive \"%s\" and cannot be used for other archives", alias, (*fd_ptr)->fname); + zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, error); + efree(error); + RETURN_FALSE; + } if (SUCCESS == zend_hash_find(&(PHAR_GLOBALS->phar_alias_map), phar_obj->arc.archive->alias, phar_obj->arc.archive->alias_len, (void**)&fd_ptr)) { zend_hash_del(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len); fd = *fd_ptr; diff --git a/ext/phar/tests/phar_setalias2.phpt b/ext/phar/tests/phar_setalias2.phpt new file mode 100644 index 0000000000..2a41744fef --- /dev/null +++ b/ext/phar/tests/phar_setalias2.phpt @@ -0,0 +1,43 @@ +--TEST-- +Phar::setAlias() error +--SKIPIF-- +<?php if (!extension_loaded("phar")) print "skip"; ?> +--INI-- +phar.require_hash=0 +phar.readonly=0 +--FILE-- +<?php +$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php'; +$pname = 'phar://' . $fname; +$file = '<?php echo "first stub\n"; __HALT_COMPILER(); ?>'; + +$files = array(); +$files['a'] = 'a'; +$files['b'] = 'b'; +$files['c'] = 'c'; + +include 'phar_test.inc'; + +$phar = new Phar($fname); +echo $phar->getAlias() . "\n"; +$phar->setAlias('test'); +echo $phar->getAlias() . "\n"; +$phar = new Phar(dirname(__FILE__) . '/notphar.phar'); +try { + $phar->setAlias('test'); +} catch (Exception $e) { + echo $e->getMessage() . "\n"; +} +?> +===DONE=== +--CLEAN-- +<?php +unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php'); +unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phartmp.php'); +__HALT_COMPILER(); +?> +--EXPECTF-- +hio +test +alias "test" is already used for archive "%sphar_setalias2.phar.php" and cannot be used for other archives +===DONE=== |