diff options
| -rwxr-xr-x | Zend/tests/bug46304.phpt | 65 | ||||
| -rw-r--r-- | Zend/zend_constants.c | 25 |
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) || |
