From: Felipe Pena Date: Sun, 8 Mar 2009 17:23:44 +0000 (+0000) Subject: - Fixed bug #47593 (interface_exists() returns false when using absolute namespace... X-Git-Tag: php-5.4.0alpha1~191^2~4187 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d795d4975159e5787b0f94f203fc30f12b26b67e;p=php - Fixed bug #47593 (interface_exists() returns false when using absolute namespace path) Patch by Kalle. --- diff --git a/Zend/tests/bug47593.phpt b/Zend/tests/bug47593.phpt new file mode 100644 index 0000000000..98aa19a91c --- /dev/null +++ b/Zend/tests/bug47593.phpt @@ -0,0 +1,34 @@ +--TEST-- +Bug #47593 (interface_exists() returns false when using absolute namespace path) +--FILE-- + +--EXPECT-- +bool(true) +bool(true) +int(11) +bool(true) +bool(false) diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 83adda9924..c4c797dd20 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -1230,8 +1230,24 @@ ZEND_FUNCTION(interface_exists) } if (!autoload) { + zstr name; + int len; + lc_name = zend_u_str_case_fold(type, iface_name, iface_name_len, 1, &lc_name_len); - found = zend_u_hash_find(EG(class_table), type, lc_name, lc_name_len+1, (void **) &ce); + + /* Ignore leading "\" */ + name = lc_name; + len = iface_name_len; + if (lc_name.s[0] == '\\') { + if (type == IS_UNICODE) { + name.u = &lc_name.u[1]; + } else { + name.s = &lc_name.s[1]; + } + len--; + } + + found = zend_u_hash_find(EG(class_table), type, name, len+1, (void **) &ce); efree(lc_name.v); RETURN_BOOL(found == SUCCESS && (*ce)->ce_flags & ZEND_ACC_INTERFACE); } @@ -1260,8 +1276,19 @@ ZEND_FUNCTION(function_exists) } lcname = zend_u_str_case_fold(function_name_type, function_name, function_name_len, 1, &lcname_len); + + function_name = lcname; + if (function_name.s[0] == '\\') { + if (function_name_type == IS_UNICODE) { + function_name.u = &lcname.u[1]; + } else { + function_name.s = &lcname.s[1]; + } + function_name_len--; + } + - retval = (zend_u_hash_find(EG(function_table), function_name_type, lcname, lcname_len+1, (void **)&func) == SUCCESS); + retval = (zend_u_hash_find(EG(function_table), function_name_type, function_name, function_name_len+1, (void **)&func) == SUCCESS); efree(lcname.v);