|| zend_string_equals_literal(name, "array_diff")
|| zend_string_equals_literal(name, "array_diff_assoc")
|| zend_string_equals_literal(name, "array_diff_key")
+ || zend_string_equals_literal(name, "array_flip")
|| zend_string_equals_literal(name, "array_is_list")
|| zend_string_equals_literal(name, "array_key_exists")
|| zend_string_equals_literal(name, "array_keys")
#endif
|| zend_string_equals_literal(name, "imagetypes")
|| zend_string_equals_literal(name, "in_array")
+ || zend_string_equals_literal(name, "implode")
|| zend_string_equals_literal(name, "ltrim")
|| zend_string_equals_literal(name, "php_sapi_name")
|| zend_string_equals_literal(name, "php_uname")
return true;
}
- /* For the following functions we need to check arguments to prevent warnings during
- * evaluation. */
- if (num_args == 1) {
- if (zend_string_equals_literal(name, "array_flip")) {
- zval *entry;
-
- if (Z_TYPE_P(args[0]) != IS_ARRAY) {
- return false;
- }
- ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(args[0]), entry) {
- /* Throws warning for non int/string values. */
- if (Z_TYPE_P(entry) != IS_LONG && Z_TYPE_P(entry) != IS_STRING) {
- return false;
- }
- } ZEND_HASH_FOREACH_END();
- return true;
- }
- if (zend_string_equals_literal(name, "implode")) {
- zval *entry;
-
- if (Z_TYPE_P(args[0]) != IS_ARRAY) {
- return false;
- }
-
- ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(args[0]), entry) {
- /* May throw warning during conversion to string. */
- if (Z_TYPE_P(entry) > IS_STRING) {
- return false;
- }
- } ZEND_HASH_FOREACH_END();
- return true;
- }
- return false;
- }
-
if (num_args == 2) {
if (zend_string_equals_literal(name, "str_repeat")) {
/* Avoid creating overly large strings at compile-time. */
&& Z_TYPE_P(args[1]) == IS_LONG
&& zend_safe_address(Z_STRLEN_P(args[0]), Z_LVAL_P(args[1]), 0, &overflow) < 64 * 1024
&& !overflow;
- } else if (zend_string_equals_literal(name, "implode")) {
- zval *entry;
-
- if ((Z_TYPE_P(args[0]) != IS_STRING || Z_TYPE_P(args[1]) != IS_ARRAY)
- && (Z_TYPE_P(args[0]) != IS_ARRAY || Z_TYPE_P(args[1]) != IS_STRING)) {
- return false;
- }
-
- /* May throw warning during conversion to string. */
- if (Z_TYPE_P(args[0]) == IS_ARRAY) {
- ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(args[0]), entry) {
- if (Z_TYPE_P(entry) > IS_STRING) {
- return false;
- }
- } ZEND_HASH_FOREACH_END();
- } else {
- ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(args[1]), entry) {
- if (Z_TYPE_P(entry) > IS_STRING) {
- return false;
- }
- } ZEND_HASH_FOREACH_END();
- }
- return true;
}
return false;
}
execute_data->prev_execute_data = &dummy_frame;
EG(current_execute_data) = execute_data;
+ /* Enable suppression and counting of warnings. */
+ ZEND_ASSERT(EG(capture_warnings_during_sccp) == 0);
+ EG(capture_warnings_during_sccp) = 1;
+
EX(func) = func;
EX_NUM_ARGS() = num_args;
for (i = 0; i < num_args; i++) {
retval = FAILURE;
}
+ if (EG(capture_warnings_during_sccp) > 1) {
+ zval_ptr_dtor(result);
+ retval = FAILURE;
+ }
+ EG(capture_warnings_during_sccp) = 0;
+
efree(execute_data);
EG(current_execute_data) = prev_execute_data;
return retval;
zend_init_exception_op();
zend_init_call_trampoline_op();
memset(&executor_globals->trampoline, 0, sizeof(zend_op_array));
- executor_globals->lambda_count = 0;
+ executor_globals->warnings_during_sccp = 0;
ZVAL_UNDEF(&executor_globals->user_error_handler);
ZVAL_UNDEF(&executor_globals->user_exception_handler);
executor_globals->in_autoload = NULL;
zend_stack delayed_oplines_stack;
int type = orig_type & E_ALL;
+ /* If we're executing a function during SCCP, count any warnings that may be emitted,
+ * but don't perform any other error handling. */
+ if (EG(capture_warnings_during_sccp)) {
+ ZEND_ASSERT(!(type & E_FATAL_ERRORS) && "Fatal error during SCCP");
+ EG(capture_warnings_during_sccp)++;
+ return;
+ }
+
/* Report about uncaught exception in case of fatal errors */
if (EG(exception)) {
zend_execute_data *ex;