From 82e14ff8e77cf818e3727b2efa46c0fc4e9db0dc Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Tue, 22 Sep 2020 18:32:21 +0100 Subject: [PATCH] Drop usage of E_RECOVERABLE_ERROR in Session extension --- ext/session/session.c | 19 ++++++++++--------- ext/session/tests/bug60860.phpt | 2 +- ext/session/tests/bug73100.phpt | 10 +++++++--- ...g_save_handler_ini_setting_in_runtime.phpt | 12 ++++++++++++ .../session_set_save_handler_class_014.phpt | 2 +- 5 files changed, 31 insertions(+), 14 deletions(-) create mode 100644 ext/session/tests/error_when_setting_save_handler_ini_setting_in_runtime.phpt diff --git a/ext/session/session.c b/ext/session/session.c index 79b82f90f7..bf05a547ac 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -536,21 +536,18 @@ static void php_session_normalize_vars() /* {{{ */ static PHP_INI_MH(OnUpdateSaveHandler) /* {{{ */ { const ps_module *tmp; + int err_type = E_ERROR; SESSION_CHECK_ACTIVE_STATE; SESSION_CHECK_OUTPUT_STATE; tmp = _php_find_ps_module(ZSTR_VAL(new_value)); - if (PG(modules_activated) && !tmp) { - int err_type; - - if (stage == ZEND_INI_STAGE_RUNTIME) { - err_type = E_WARNING; - } else { - err_type = E_ERROR; - } + if (stage == ZEND_INI_STAGE_RUNTIME) { + err_type = E_WARNING; + } + if (PG(modules_activated) && !tmp) { /* Do not output error when restoring ini options. */ if (stage != ZEND_INI_STAGE_DEACTIVATE) { php_error_docref(NULL, err_type, "Session save handler \"%s\" cannot be found", ZSTR_VAL(new_value)); @@ -561,7 +558,7 @@ static PHP_INI_MH(OnUpdateSaveHandler) /* {{{ */ /* "user" save handler should not be set by user */ if (!PS(set_handler) && tmp == ps_user_ptr) { - php_error_docref(NULL, E_RECOVERABLE_ERROR, "Session save handler \"user\" cannot be set by ini_set() or session_module_name()"); + php_error_docref(NULL, err_type, "Session save handler \"user\" cannot be set by ini_set()"); return FAILURE; } @@ -1917,6 +1914,10 @@ PHP_FUNCTION(session_module_name) } if (name) { + if (zend_string_equals_literal_ci(name, "user")) { + zend_argument_value_error(1, "cannot be \"user\""); + RETURN_THROWS(); + } if (!_php_find_ps_module(ZSTR_VAL(name))) { php_error_docref(NULL, E_WARNING, "Session handler module \"%s\" cannot be found", ZSTR_VAL(name)); diff --git a/ext/session/tests/bug60860.phpt b/ext/session/tests/bug60860.phpt index 487fba5307..fbd8a6eeab 100644 --- a/ext/session/tests/bug60860.phpt +++ b/ext/session/tests/bug60860.phpt @@ -15,5 +15,5 @@ echo "ok\n"; ?> --EXPECT-- -Recoverable fatal error: PHP Startup: Session save handler "user" cannot be set by ini_set() or session_module_name() in Unknown on line 0 +Fatal error: PHP Startup: Session save handler "user" cannot be set by ini_set() in Unknown on line 0 ok diff --git a/ext/session/tests/bug73100.phpt b/ext/session/tests/bug73100.phpt index a59e9f41cc..a9c140aa88 100644 --- a/ext/session/tests/bug73100.phpt +++ b/ext/session/tests/bug73100.phpt @@ -14,7 +14,11 @@ var_dump(session_start()); session_module_name("user"); var_dump(session_destroy()); -session_module_name("user"); +try { + session_module_name("user"); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} ?> ===DONE=== --EXPECTF-- @@ -22,5 +26,5 @@ bool(true) Warning: session_module_name(): Session save handler module cannot be changed when a session is active in %s on line %d bool(true) - -Recoverable fatal error: session_module_name(): Session save handler "user" cannot be set by ini_set() or session_module_name() in %s on line %d +session_module_name(): Argument #1 ($module) cannot be "user" +===DONE=== diff --git a/ext/session/tests/error_when_setting_save_handler_ini_setting_in_runtime.phpt b/ext/session/tests/error_when_setting_save_handler_ini_setting_in_runtime.phpt new file mode 100644 index 0000000000..f176a7ae79 --- /dev/null +++ b/ext/session/tests/error_when_setting_save_handler_ini_setting_in_runtime.phpt @@ -0,0 +1,12 @@ +--TEST-- +Error when setting session.save_handler to user via ini_set +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Warning: ini_set(): Session save handler "user" cannot be set by ini_set() in %s on line %d diff --git a/ext/session/tests/session_set_save_handler_class_014.phpt b/ext/session/tests/session_set_save_handler_class_014.phpt index 6eee4f8b6a..ff1b84a87e 100644 --- a/ext/session/tests/session_set_save_handler_class_014.phpt +++ b/ext/session/tests/session_set_save_handler_class_014.phpt @@ -21,5 +21,5 @@ session_set_save_handler($handler); session_start(); ?> --EXPECT-- -Recoverable fatal error: PHP Startup: Session save handler "user" cannot be set by ini_set() or session_module_name() in Unknown on line 0 +Fatal error: PHP Startup: Session save handler "user" cannot be set by ini_set() in Unknown on line 0 *** Testing session_set_save_handler() : calling default handler when save_handler=user *** -- 2.40.0