--- /dev/null
+--TEST--
+Bug #43651 (is_callable() with one or more nonconsecutive colons crashes)
+--FILE--
+<?php
+class Test {
+ static function foo() {}
+}
+
+var_dump(is_callable("::"));
+var_dump(is_callable(":"));
+var_dump(is_callable("x:"));
+var_dump(is_callable(":x"));
+var_dump(is_callable("x:x"));
+var_dump(is_callable("x::"));
+var_dump(is_callable("::x"));
+var_dump(is_callable("x::x"));
+var_dump(is_callable("cd"));
+var_dump(is_callable("Test::"));
+var_dump(is_callable("::Test"));
+var_dump(is_callable("::Test::"));
+var_dump(is_callable("Test::foo"));
+var_dump(is_callable("::Test::foo"));
+var_dump(is_callable("is_string"));
+var_dump(is_callable("::is_string"));
+--EXPECT--
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
clen = colon - Z_STRVAL_P(callable);
mlen = Z_STRLEN_P(callable) - clen - 2;
lmname = colon + 2;
- }
- if (colon && colon == Z_STRVAL_P(callable)) {
- return 0;
- }
- if (colon != NULL) {
+ if (colon == Z_STRVAL_P(callable)) {
+ return 0;
+ }
+
/* This is a compound name.
* Try to fetch class and then find static method. */
- *ce_ptr = zend_fetch_class(Z_STRVAL_P(callable), clen, ZEND_FETCH_CLASS_AUTO TSRMLS_CC);
+ *ce_ptr = zend_fetch_class(Z_STRVAL_P(callable), clen, ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_SILENT TSRMLS_CC);
if (!*ce_ptr) {
return 0;
}
colon > fname &&
*(colon - 1) == ':'
) {
+ zend_class_entry **pce, *ce_child = NULL;
+
clen = colon - fname - 1;
fname_len -= (clen + 2);
fname = colon + 1;
- }
- if (colon != NULL) {
- zend_class_entry **pce, *ce_child = NULL;
lcname = zend_str_tolower_dup(cname, clen);
/* caution: lcname is not '\0' terminated */