--- /dev/null
+--TEST--
+Bug #69315 (disable_functions behaviors inconsistently)
+--INI--
+disable_functions=strlen,defined,call_user_func,constant,is_callable,is_string
+--FILE--
+<?php
+
+var_dump(function_exists("strlen"));
+var_dump(is_callable("strlen"));
+var_dump(strlen("xxx"));
+var_dump(defined("PHP_VERSION"));
+var_dump(constant("PHP_VERSION"));
+var_dump(call_user_func("strlen"));
+var_dump(is_string("xxx"));
+
+--EXPECTF--
+bool(false)
+bool(true)
+
+Warning: strlen() has been disabled for security reasons in %sbug69315.php on line %d
+NULL
+
+Warning: defined() has been disabled for security reasons in %sbug69315.php on line %d
+NULL
+
+Warning: constant() has been disabled for security reasons in %sbug69315.php on line %d
+NULL
+
+Warning: call_user_func() has been disabled for security reasons in %sbug69315.php on line %d
+NULL
+
+Warning: is_string() has been disabled for security reasons in %sbug69315.php on line %d
+NULL
}
/* }}} */
-
-
static int zend_compile_assert(znode *result, zend_ast_list *args, zend_string *name, zend_function *fbc) /* {{{ */
{
if (EG(assertions) >= 0) {
int zend_try_compile_special_func(znode *result, zend_string *lcname, zend_ast_list *args, zend_function *fbc) /* {{{ */
{
+ if (fbc->internal_function.handler == ZEND_FN(display_disabled_function)) {
+ return FAILURE;
+ }
+
if (zend_string_equals_literal(lcname, "strlen")) {
return zend_compile_func_strlen(result, args);
} else if (zend_string_equals_literal(lcname, "is_null")) {
zend_string_release(lc_name);
} else if (Z_STRLEN(ZEND_OP2_LITERAL(init_opline)) == sizeof("extension_loaded")-1 &&
!memcmp(Z_STRVAL(ZEND_OP2_LITERAL(init_opline)),
- "extension_loaded", sizeof("extension_loaded")-1)) {
+ "extension_loaded", sizeof("extension_loaded")-1) &&
+ !zend_optimizer_is_disabled_func("extension_loaded", sizeof("extension_loaded") - 1)) {
zval t;
zend_string *lc_name = zend_string_tolower(
Z_STR(ZEND_OP1_LITERAL(send1_opline)));
}
} else if (Z_STRLEN(ZEND_OP2_LITERAL(init_opline)) == sizeof("defined")-1 &&
!memcmp(Z_STRVAL(ZEND_OP2_LITERAL(init_opline)),
- "defined", sizeof("defined")-1)) {
+ "defined", sizeof("defined")-1) &&
+ !zend_optimizer_is_disabled_func("defined", sizeof("defined") - 1)) {
zval t;
if (zend_optimizer_get_persistent_constant(Z_STR(ZEND_OP1_LITERAL(send1_opline)), &t, 0)) {
}
} else if (Z_STRLEN(ZEND_OP2_LITERAL(init_opline)) == sizeof("constant")-1 &&
!memcmp(Z_STRVAL(ZEND_OP2_LITERAL(init_opline)),
- "constant", sizeof("constant")-1)) {
+ "constant", sizeof("constant")-1) &&
+ !zend_optimizer_is_disabled_func("constant", sizeof("constant") - 1)) {
zval t;
if (zend_optimizer_get_persistent_constant(Z_STR(ZEND_OP1_LITERAL(send1_opline)), &t, 1)) {
}
} else if ((CG(compiler_options) & ZEND_COMPILE_NO_BUILTIN_STRLEN) == 0 &&
Z_STRLEN(ZEND_OP2_LITERAL(init_opline)) == sizeof("strlen") - 1 &&
- !memcmp(Z_STRVAL(ZEND_OP2_LITERAL(init_opline)), "strlen", sizeof("strlen") - 1)) {
+ !memcmp(Z_STRVAL(ZEND_OP2_LITERAL(init_opline)), "strlen", sizeof("strlen") - 1) &&
+ !zend_optimizer_is_disabled_func("strlen", sizeof("strlen") - 1)) {
zval t;
ZVAL_LONG(&t, Z_STRLEN(ZEND_OP1_LITERAL(send1_opline)));
/* dirname(IS_CONST/IS_STRING) -> IS_CONST/IS_STRING */
} else if (Z_STRLEN(ZEND_OP2_LITERAL(init_opline)) == sizeof("dirname")-1 &&
!memcmp(Z_STRVAL(ZEND_OP2_LITERAL(init_opline)),
- "dirname", sizeof("dirname")-1) &&
+ "dirname", sizeof("dirname") - 1) &&
+ !zend_optimizer_is_disabled_func("dirname", sizeof("dirname") - 1) &&
IS_ABSOLUTE_PATH(Z_STRVAL(ZEND_OP1_LITERAL(send1_opline)), Z_STRLEN(ZEND_OP1_LITERAL(send1_opline)))) {
zend_string *dirname = zend_string_init(Z_STRVAL(ZEND_OP1_LITERAL(send1_opline)), Z_STRLEN(ZEND_OP1_LITERAL(send1_opline)), 0);
dirname->len = zend_dirname(dirname->val, dirname->len);