Commit 814ade88806 for php
commit 814ade88806a4865cbdc517fc164e7941dd53dd3
Author: Gina Peter Banyard <girgias@php.net>
Date: Sat Sep 26 00:57:18 2026 +0100
session: clean-up code relating to calling user functions (#23909)
diff --git a/ext/session/mod_user.c b/ext/session/mod_user.c
index a023ef7e428..0ac08f92f96 100644
--- a/ext/session/mod_user.c
+++ b/ext/session/mod_user.c
@@ -22,9 +22,8 @@ const ps_module ps_mod_user = {
PS_MOD_UPDATE_TIMESTAMP(user)
};
-static void ps_call_handler(zval *func, int argc, zval *argv, zval *retval)
+static void ps_call_handler(zval *func, uint32_t argc, zval *argv, zval *retval)
{
- int i;
if (PS(in_save_handler)) {
PS(in_save_handler) = false;
ZVAL_UNDEF(retval);
@@ -34,12 +33,10 @@ static void ps_call_handler(zval *func, int argc, zval *argv, zval *retval)
if (call_user_function(NULL, NULL, func, retval, argc, argv) == FAILURE) {
zval_ptr_dtor(retval);
ZVAL_UNDEF(retval);
- } else if (Z_ISUNDEF_P(retval)) {
- ZVAL_NULL(retval);
}
PS(in_save_handler) = false;
}
- for (i = 0; i < argc; i++) {
+ for (uint32_t i = 0; i < argc; i++) {
zval_ptr_dtor(&argv[i]);
}
}
@@ -48,34 +45,27 @@ static void ps_call_handler(zval *func, int argc, zval *argv, zval *retval)
static zend_result verify_bool_return_type_userland_calls(const zval *value)
{
- /* Exit or exception in userland call */
- if (Z_TYPE_P(value) == IS_UNDEF) {
- return FAILURE;
- }
- if (Z_TYPE_P(value) == IS_TRUE) {
- return SUCCESS;
- }
- if (Z_TYPE_P(value) == IS_FALSE) {
- return FAILURE;
- }
- if ((Z_TYPE_P(value) == IS_LONG) && (Z_LVAL_P(value) == -1)) {
- /* TODO Why are exceptions checked? */
- if (!EG(exception)) {
- php_error_docref(NULL, E_DEPRECATED, "Session callback must have a return value of type bool, %s returned", zend_zval_value_name(value));
- }
- return FAILURE;
- }
- if ((Z_TYPE_P(value) == IS_LONG) && (Z_LVAL_P(value) == 0)) {
- /* TODO Why are exceptions checked? */
- if (!EG(exception)) {
- php_error_docref(NULL, E_DEPRECATED, "Session callback must have a return value of type bool, %s returned", zend_zval_value_name(value));
- }
- return SUCCESS;
- }
- if (!EG(exception)) {
- zend_type_error("Session callback must have a return value of type bool, %s returned", zend_zval_value_name(value)); \
+ switch (Z_TYPE_P(value)) {
+ case IS_TRUE:
+ return SUCCESS;
+ case IS_FALSE:
+ /* Exit or exception in userland call */
+ case IS_UNDEF:
+ return FAILURE;
+ case IS_LONG:
+ /* Deprecated cases */
+ if (Z_LVAL_P(value) == 0) {
+ php_error_docref(NULL, E_DEPRECATED, "Session callback must have a return value of type bool, %s returned", zend_zval_value_name(value));
+ return SUCCESS;
+ } else if (Z_LVAL_P(value) == -1) {
+ php_error_docref(NULL, E_DEPRECATED, "Session callback must have a return value of type bool, %s returned", zend_zval_value_name(value));
+ return FAILURE;
+ }
+ ZEND_FALLTHROUGH;
+ default:
+ zend_type_error("Session callback must have a return value of type bool, %s returned", zend_zval_value_name(value));
+ return FAILURE;
}
- return FAILURE;
}
PS_OPEN_FUNC(user)
@@ -92,9 +82,7 @@ PS_OPEN_FUNC(user)
ps_call_handler(&PSF(open), 2, args, &retval);
} zend_catch {
PS(session_status) = php_session_none;
- if (!Z_ISUNDEF(retval)) {
- zval_ptr_dtor(&retval);
- }
+ zval_ptr_dtor(&retval);
zend_bailout();
} zend_end_try();
@@ -107,7 +95,6 @@ PS_OPEN_FUNC(user)
PS_CLOSE_FUNC(user)
{
- bool bailout = false;
zval retval;
zend_result ret = FAILURE;
@@ -121,18 +108,13 @@ PS_CLOSE_FUNC(user)
zend_try {
ps_call_handler(&PSF(close), 0, NULL, &retval);
} zend_catch {
- bailout = true;
+ PS(mod_user_implemented) = false;
+ zval_ptr_dtor(&retval);
+ zend_bailout();
} zend_end_try();
PS(mod_user_implemented) = false;
- if (bailout) {
- if (!Z_ISUNDEF(retval)) {
- zval_ptr_dtor(&retval);
- }
- zend_bailout();
- }
-
ret = verify_bool_return_type_userland_calls(&retval);
zval_ptr_dtor(&retval);
return ret;