diff options
| author | Johannes Schlüter <johannes@php.net> | 2008-12-09 19:17:11 +0000 |
|---|---|---|
| committer | Johannes Schlüter <johannes@php.net> | 2008-12-09 19:17:11 +0000 |
| commit | d828b8acc0403eed67bb73ea305581e319213555 (patch) | |
| tree | 5311a6002f904c7824b221cb7e7afa7b7ae596c1 | |
| parent | a8578a5ab1bd78b553ca071aae95e25c441af24a (diff) | |
| download | php-git-d828b8acc0403eed67bb73ea305581e319213555.tar.gz | |
MFH: Fix #46813 (class_exists doesn`t work with fully qualified namespace)
| -rw-r--r-- | Zend/tests/bug46813.phpt | 24 | ||||
| -rw-r--r-- | Zend/zend_builtin_functions.c | 13 |
2 files changed, 36 insertions, 1 deletions
diff --git a/Zend/tests/bug46813.phpt b/Zend/tests/bug46813.phpt new file mode 100644 index 0000000000..91837db1ff --- /dev/null +++ b/Zend/tests/bug46813.phpt @@ -0,0 +1,24 @@ +--TEST-- +Bug #46813: class_exists doesn`t work with fully qualified namespace +--FILE-- +<?php +namespace test; +{ + class inner + { + + } +} + +$inner = new \test\inner(); + +echo "autoload == true:\n"; +var_dump(class_exists('\test\inner', true)); +echo "autoload == false:\n"; +var_dump(class_exists('\test\inner', true)); +?> +--EXPECT-- +autoload == true: +bool(true) +autoload == false: +bool(true) diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 0a936ed7f4..3a35373f75 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -1157,10 +1157,21 @@ ZEND_FUNCTION(class_exists) } if (!autoload) { + char *name; + int len; + lc_name = do_alloca(class_name_len + 1, use_heap); zend_str_tolower_copy(lc_name, class_name, class_name_len); + + /* Ignore leading "\" */ + name = lc_name; + len = class_name_len; + if (lc_name[0] == '\\') { + name = &lc_name[1]; + len--; + } - found = zend_hash_find(EG(class_table), lc_name, class_name_len+1, (void **) &ce); + found = zend_hash_find(EG(class_table), name, len+1, (void **) &ce); free_alloca(lc_name, use_heap); RETURN_BOOL(found == SUCCESS && !((*ce)->ce_flags & ZEND_ACC_INTERFACE)); } |
