summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Beaver <cellog@php.net>2007-08-23 23:23:26 +0000
committerGreg Beaver <cellog@php.net>2007-08-23 23:23:26 +0000
commit5178a945459ec587bad6361f453ada43e87f8f8d (patch)
treea47f3b2642b0f82fb350f0d07fe21da6018d8d6f
parente02bd088893894ec5f84a05c16d9a6a3480879a8 (diff)
downloadphp-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.xml1
-rwxr-xr-xext/phar/phar_object.c9
-rw-r--r--ext/phar/tests/phar_setalias2.phpt43
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===