Skip to content

Commit a93a51c

Browse files
author
Yasuo Ohgaki
committed
Fix bug #73100 - Improve bug fix. Forbid to set 'user' save handler other than set_save_handler().
1 parent d4831e2 commit a93a51c

File tree

5 files changed

+25
-6
lines changed

5 files changed

+25
-6
lines changed

ext/session/php_session.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,8 @@ typedef struct _php_ps_globals {
204204

205205
zend_bool use_strict_mode; /* whether or not PHP accepts unknown session ids */
206206
zend_bool lazy_write; /* omit session write when it is possible */
207-
zend_bool in_save_handler; /* state that if session is in save handler or not */
207+
zend_bool in_save_handler; /* state if session is in save handler or not */
208+
zend_bool set_handler; /* state if session module i setting handler or not */
208209
zend_string *session_vars; /* serialized original session data */
209210
} php_ps_globals;
210211

ext/session/session.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ static inline void php_rinit_session_globals(void) /* {{{ */
113113
PS(id) = NULL;
114114
PS(session_status) = php_session_none;
115115
PS(in_save_handler) = 0;
116+
PS(set_handler) = 0;
116117
PS(mod_data) = NULL;
117118
PS(mod_user_is_open) = 0;
118119
PS(define_sid) = 1;
@@ -548,6 +549,13 @@ static PHP_INI_MH(OnUpdateSaveHandler) /* {{{ */
548549
if (stage != ZEND_INI_STAGE_DEACTIVATE) {
549550
php_error_docref(NULL, err_type, "Cannot find save handler '%s'", ZSTR_VAL(new_value));
550551
}
552+
553+
return FAILURE;
554+
}
555+
556+
/* "user" save handler should not be set by user */
557+
if (!PS(set_handler) && tmp == ps_user_ptr) {
558+
php_error_docref(NULL, E_RECOVERABLE_ERROR, "Cannot set 'user' save handler by ini_set() or sesion_module_name()");
551559
return FAILURE;
552560
}
553561

@@ -1929,7 +1937,9 @@ static PHP_FUNCTION(session_set_save_handler)
19291937
if (PS(mod) && PS(session_status) != php_session_active && PS(mod) != &ps_mod_user) {
19301938
ini_name = zend_string_init("session.save_handler", sizeof("session.save_handler") - 1, 0);
19311939
ini_val = zend_string_init("user", sizeof("user") - 1, 0);
1940+
PS(set_handler) = 1;
19321941
zend_alter_ini_entry(ini_name, ini_val, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
1942+
PS(set_handler) = 0;
19331943
zend_string_release(ini_val);
19341944
zend_string_release(ini_name);
19351945
}
@@ -1962,7 +1972,9 @@ static PHP_FUNCTION(session_set_save_handler)
19621972
if (PS(mod) && PS(mod) != &ps_mod_user) {
19631973
ini_name = zend_string_init("session.save_handler", sizeof("session.save_handler") - 1, 0);
19641974
ini_val = zend_string_init("user", sizeof("user") - 1, 0);
1975+
PS(set_handler) = 1;
19651976
zend_alter_ini_entry(ini_name, ini_val, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
1977+
PS(set_handler) = 0;
19661978
zend_string_release(ini_val);
19671979
zend_string_release(ini_name);
19681980
}

ext/session/tests/bug60860.phpt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ echo "ok\n";
1212

1313
?>
1414
--EXPECTF--
15-
Warning: session_start(): user session functions not defined in %s on line 3
15+
PHP Recoverable fatal error: PHP Startup: Cannot set 'user' save handler by ini_set() or sesion_module_name() in Unknown on line 0
1616

17-
Warning: session_start(): Failed to initialize storage module: user (path: ) in %s on line 3
17+
Recoverable fatal error: PHP Startup: Cannot set 'user' save handler by ini_set() or sesion_module_name() in Unknown on line 0
1818
ok
19+

ext/session/tests/bug73100.phpt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,15 @@ ob_start();
1010
var_dump(session_start());
1111
session_module_name("user");
1212
var_dump(session_destroy());
13+
14+
session_module_name("user");
1315
?>
1416
===DONE===
1517
--EXPECTF--
1618
bool(true)
1719

1820
Warning: session_module_name(): Cannot change save handler module when session is active in %s on line 4
1921
bool(true)
20-
===DONE===
22+
23+
Recoverable fatal error: session_module_name(): Cannot set 'user' save handler by ini_set() or sesion_module_name() in %s on line 7
24+

ext/session/tests/session_set_save_handler_class_014.phpt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ session_set_save_handler($handler);
2525
session_start();
2626

2727
--EXPECTF--
28-
*** Testing session_set_save_handler() : calling default handler when save_handler=user ***
28+
PHP Recoverable fatal error: PHP Startup: Cannot set 'user' save handler by ini_set() or sesion_module_name() in Unknown on line 0
2929

30-
Fatal error: SessionHandler::open(): Cannot call default session handler in %s on line %d
30+
Recoverable fatal error: PHP Startup: Cannot set 'user' save handler by ini_set() or sesion_module_name() in Unknown on line 0
31+
*** Testing session_set_save_handler() : calling default handler when save_handler=user ***

0 commit comments

Comments
 (0)