From 005d04aa961fda6fa69585d9a5fd2a52db1bb90b Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Thu, 23 Oct 2025 16:30:46 +0100 Subject: [PATCH 1/2] zend_call_function: emit function deprecation before setting up call frame (#20264) --- .../zend_call_function_deprecated_frame.phpt | 25 +++++++++++++++++++ Zend/zend_execute_API.c | 7 +++--- 2 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 Zend/tests/functions/zend_call_function_deprecated_frame.phpt diff --git a/Zend/tests/functions/zend_call_function_deprecated_frame.phpt b/Zend/tests/functions/zend_call_function_deprecated_frame.phpt new file mode 100644 index 000000000000..ce2943a876e2 --- /dev/null +++ b/Zend/tests/functions/zend_call_function_deprecated_frame.phpt @@ -0,0 +1,25 @@ +--TEST-- +Deprecated function notice promoted to exception within zend_call_function() +--FILE-- + +--EXPECTF-- +Fatal error: Uncaught Exception: Function foo() is deprecated in %s:%d +Stack trace: +#0 [internal function]: {closure:%s:%d}(16384, 'Function foo() ...', '%s', %d) +#1 %s(%d): array_map(Object(Closure), Array) +#2 {main} + thrown in %s on line %d diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 54ddcd48f2d3..f174aac49ef4 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -862,18 +862,17 @@ zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_ call_info = ZEND_CALL_TOP_FUNCTION | ZEND_CALL_DYNAMIC | ZEND_CALL_HAS_THIS; } - call = zend_vm_stack_push_call_frame(call_info, - func, fci->param_count, object_or_called_scope); - if (UNEXPECTED(func->common.fn_flags & ZEND_ACC_DEPRECATED)) { zend_deprecated_function(func); if (UNEXPECTED(EG(exception))) { - zend_vm_stack_free_call_frame(call); return SUCCESS; } } + call = zend_vm_stack_push_call_frame(call_info, + func, fci->param_count, object_or_called_scope); + for (uint32_t i = 0; i < fci->param_count; i++) { zval *param = ZEND_CALL_ARG(call, i+1); zval *arg = &fci->params[i]; From c7fc819c2dbcebc78c48542da88d04568f4ee793 Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Mon, 20 Oct 2025 23:19:47 +0200 Subject: [PATCH 2/2] Use MYSQL_TYPE constants instead of FIELD_TYPE The FIELD_TYPE constants are for BC. The JSON/VECTOR types are not defined in FIELD_TYPE for libmysqlclient. MYSQL_TYPE is available since MYSQL 5.0.0, so switch to that. Since MYSQL_TYPEs are enums and not defines, we need version checks instead. JSON was added in mysql 8.0.0 in mysql/mysql-server@c24045514581 JSON support was backported via mysql/mysql-server@3e14f9f in 5.7.8. VECTOR was added in mysql 9.0.0 in mysql/mysql-server@8cd51511de7d Replaces GH-20245. --- ext/pdo_mysql/mysql_statement.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ext/pdo_mysql/mysql_statement.c b/ext/pdo_mysql/mysql_statement.c index b3dc527b1091..7dd51a166cac 100644 --- a/ext/pdo_mysql/mysql_statement.c +++ b/ext/pdo_mysql/mysql_statement.c @@ -715,7 +715,7 @@ static int pdo_mysql_stmt_get_col( static char *type_to_name_native(int type) /* {{{ */ { -#define PDO_MYSQL_NATIVE_TYPE_NAME(x) case FIELD_TYPE_##x: return #x; +#define PDO_MYSQL_NATIVE_TYPE_NAME(x) case MYSQL_TYPE_##x: return #x; switch (type) { PDO_MYSQL_NATIVE_TYPE_NAME(STRING) @@ -749,10 +749,11 @@ static char *type_to_name_native(int type) /* {{{ */ #ifdef FIELD_TYPE_NEWDATE PDO_MYSQL_NATIVE_TYPE_NAME(NEWDATE) #endif -#ifdef FIELD_TYPE_VECTOR + /* The following 2 don't have BC FIELD_TYPE_* aliases. */ +#if MYSQL_VERSION_ID >= 90000 && !defined(MARIADB_BASE_VERSION) /* TODO: mysqlnd support (added in 8.4 via a1ab846231aeff49c0441a30ebd44463fc7825b1) */ PDO_MYSQL_NATIVE_TYPE_NAME(VECTOR) #endif -#ifdef FIELD_TYPE_JSON +#if MYSQL_VERSION_ID >= 50708 || defined(PDO_USE_MYSQLND) PDO_MYSQL_NATIVE_TYPE_NAME(JSON) #endif PDO_MYSQL_NATIVE_TYPE_NAME(TIME)