summaryrefslogtreecommitdiff
path: root/Zend/zend_builtin_functions.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_builtin_functions.c')
-rw-r--r--Zend/zend_builtin_functions.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index fcd1deac67..1e85785c40 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -1640,6 +1640,13 @@ ZEND_FUNCTION(restore_exception_handler)
}
/* }}} */
+static int same_name(const char *key, const char *name, zend_uint name_len)
+{
+ char *lcname = zend_str_tolower_dup(name, name_len);
+ int ret = memcmp(lcname, key, name_len) == 0;
+ efree(lcname);
+ return ret;
+}
static int copy_class_or_interface_name(zend_class_entry **pce TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key)
{
@@ -1651,7 +1658,13 @@ static int copy_class_or_interface_name(zend_class_entry **pce TSRMLS_DC, int nu
if ((hash_key->nKeyLength==0 || hash_key->arKey[0]!=0)
&& (comply_mask == (ce->ce_flags & mask))) {
- add_next_index_stringl(array, ce->name, ce->name_length, 1);
+ if (ce->refcount > 1 &&
+ (ce->name_length != hash_key->nKeyLength - 1 ||
+ !same_name(hash_key->arKey, ce->name, ce->name_length))) {
+ add_next_index_stringl(array, hash_key->arKey, hash_key->nKeyLength - 1, 1);
+ } else {
+ add_next_index_stringl(array, ce->name, ce->name_length, 1);
+ }
}
return ZEND_HASH_APPLY_KEEP;
}