diff options
author | Marcus Boerger <helly@php.net> | 2005-07-25 20:24:11 +0000 |
---|---|---|
committer | Marcus Boerger <helly@php.net> | 2005-07-25 20:24:11 +0000 |
commit | 1fad73d13df29db9646e3bb81be08f2ef1f2b8aa (patch) | |
tree | 882d2c1576202c1dbd7a2a1331a9659ad0877ee4 /Zend/zend_API.c | |
parent | e8ea32a789bc97cd704db7a68e1e5a05853c4a2e (diff) | |
download | php-git-1fad73d13df29db9646e3bb81be08f2ef1f2b8aa.tar.gz |
- Fix #33853
# When a static class function is being called then we first look for the
# class with name unchanged. If the class is then not available it the
# method can never be callable, thus we return 0. If the class is available
# the lowercased name will be broken up into class and function and 1 is
# being returned.
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r-- | Zend/zend_API.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 0dad35cea2..109c5f3223 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2034,8 +2034,10 @@ ZEND_API zend_bool zend_is_callable(zval *callable, uint check_flags, char **cal ZEND_API zend_bool zend_make_callable(zval *callable, char **callable_name TSRMLS_DC) { - char *lcname, *func; + char *lcname, *func, *class_name; zend_bool retval = 0; + zend_class_entry **pce; + int class_name_len; if (zend_is_callable(callable, 0, callable_name)) { return 1; @@ -2043,14 +2045,20 @@ ZEND_API zend_bool zend_make_callable(zval *callable, char **callable_name TSRML switch (Z_TYPE_P(callable)) { case IS_STRING: lcname = zend_str_tolower_dup(Z_STRVAL_P(callable), Z_STRLEN_P(callable)); - + if ((func = strstr(lcname, "::")) != NULL) { - zval_dtor(callable); - array_init(callable); - add_next_index_stringl(callable, lcname, func - lcname, 1); - func += 2; - add_next_index_stringl(callable, func, strlen(func), 1); - retval = 1; + *func = '\0'; + class_name_len = func - lcname; + class_name = estrndup(Z_STRVAL_P(callable), class_name_len); + if (zend_lookup_class(class_name, class_name_len, &pce TSRMLS_CC) == SUCCESS) { + zval_dtor(callable); + array_init(callable); + add_next_index_stringl(callable, lcname, class_name_len, 1); + func += 2; + add_next_index_stringl(callable, func, strlen(func), 1); + retval = 1; + } + efree(class_name); } efree(lcname); break; |