summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2009-01-12 21:54:37 +0000
committerStanislav Malyshev <stas@php.net>2009-01-12 21:54:37 +0000
commite2ad4e01780bf1e6cba162750946b9adfc40526b (patch)
tree4c9cd8b09c1e0192096a80d7050b573fdc91cf37
parent47a8643e71d8962bc83886608e55f43a06d8da95 (diff)
downloadphp-git-e2ad4e01780bf1e6cba162750946b9adfc40526b.tar.gz
fix #46304: Defining namespaced constant using define() uses case sensitive match for namespace
-rwxr-xr-xZend/tests/bug46304.phpt65
-rw-r--r--Zend/zend_constants.c25
2 files changed, 86 insertions, 4 deletions
diff --git a/Zend/tests/bug46304.phpt b/Zend/tests/bug46304.phpt
new file mode 100755
index 0000000000..043d9e5be0
--- /dev/null
+++ b/Zend/tests/bug46304.phpt
@@ -0,0 +1,65 @@
+--TEST--
+Bug #46304 (defining namespaced constant using define())
+--FILE--
+<?php
+
+define('NS1\ns2\const1','value1');
+define('ns1\ns2\const2','value2');
+define('ns1\NS2\coNSt3','value3');
+define('NS1\ns2\const4','value4', true);
+define('ns1\ns2\const5','value5', true);
+define('ns1\NS2\coNSt6','value6', true);
+
+print NS1\ns2\const1 . "\n";
+print ns1\ns2\const1 . "\n";
+print ns1\NS2\const1 . "\n";
+
+print NS1\ns2\const2 . "\n";
+print ns1\ns2\const2 . "\n";
+print ns1\NS2\const2 . "\n";
+
+print NS1\ns2\coNSt3 . "\n";
+print ns1\ns2\coNSt3 . "\n";
+print ns1\ns2\coNSt3 . "\n";
+
+print NS1\ns2\const4 . "\n";
+print ns1\ns2\const4 . "\n";
+print ns1\NS2\const4 . "\n";
+print ns1\ns2\coNSt4 . "\n";
+
+print NS1\ns2\const5 . "\n";
+print ns1\ns2\const5 . "\n";
+print ns1\NS2\const5 . "\n";
+print ns1\ns2\coNSt5 . "\n";
+
+print NS1\ns2\const6 . "\n";
+print ns1\ns2\const6 . "\n";
+print ns1\NS2\const6 . "\n";
+print ns1\ns2\coNSt6 . "\n";
+
+print NS1\ns2\coNSt1 . "\n";
+?>
+--EXPECTF--
+value1
+value1
+value1
+value2
+value2
+value2
+value3
+value3
+value3
+value4
+value4
+value4
+value4
+value5
+value5
+value5
+value5
+value6
+value6
+value6
+value6
+
+Fatal error: Undefined constant 'NS1\ns2\coNSt1' in %s\bug46304.php on line %d \ No newline at end of file
diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c
index 7b5a11a24f..d6b73c4eb9 100644
--- a/Zend/zend_constants.c
+++ b/Zend/zend_constants.c
@@ -357,6 +357,7 @@ ZEND_API int zend_get_constant_ex(const char *name, uint name_len, zval *result,
int const_name_len = name_len - prefix_len - 1;
char *constant_name = colon + 1;
char *lcname;
+ int found_const = 0;
lcname = zend_str_tolower_dup(name, prefix_len);
/* Check for namespace constant */
@@ -367,7 +368,18 @@ ZEND_API int zend_get_constant_ex(const char *name, uint name_len, zval *result,
memcpy(lcname + prefix_len + 1, constant_name, const_name_len + 1);
if (zend_hash_find(EG(zend_constants), lcname, prefix_len + 1 + const_name_len + 1, (void **) &c) == SUCCESS) {
- efree(lcname);
+ found_const = 1;
+ } else {
+ /* try lowercase */
+ zend_str_tolower(lcname + prefix_len + 1, const_name_len);
+ if (zend_hash_find(EG(zend_constants), lcname, prefix_len + 1 + const_name_len + 1, (void **) &c) == SUCCESS) {
+ if ((c->flags & CONST_CS) == 0) {
+ found_const = 1;
+ }
+ }
+ }
+ efree(lcname);
+ if(found_const) {
*result = c->value;
zval_update_constant_ex(&result, (void*)1, NULL TSRMLS_CC);
zval_copy_ctor(result);
@@ -375,8 +387,6 @@ ZEND_API int zend_get_constant_ex(const char *name, uint name_len, zval *result,
Z_UNSET_ISREF_P(result);
return 1;
}
-
- efree(lcname);
/* name requires runtime resolution, need to check non-namespaced name */
if ((flags & IS_CONSTANT_UNQUALIFIED) != 0) {
name = constant_name;
@@ -414,7 +424,14 @@ ZEND_API int zend_register_constant(zend_constant *c TSRMLS_DC)
zend_str_tolower(lowercase_name, c->name_len-1);
name = lowercase_name;
} else {
- name = c->name;
+ char *slash = strrchr(c->name, '\\');
+ if(slash) {
+ lowercase_name = estrndup(c->name, c->name_len-1);
+ zend_str_tolower(lowercase_name, slash-c->name);
+ name = lowercase_name;
+ } else {
+ name = c->name;
+ }
}
if ((strncmp(name, "__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__") - 1) == 0) ||