Skip to content

Commit 90be86f

Browse files
committed
Merge branch 'PHP-7.4' into PHP-8.0
* PHP-7.4: Fix #80889: amendment
2 parents 4dca114 + 838951c commit 90be86f

File tree

2 files changed

+50
-16
lines changed

2 files changed

+50
-16
lines changed

ext/session/session.c

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1952,12 +1952,23 @@ static int save_handler_check_session() {
19521952
return SUCCESS;
19531953
}
19541954

1955+
static inline void set_user_save_handler_ini(void) {
1956+
zend_string *ini_name, *ini_val;
1957+
1958+
ini_name = zend_string_init("session.save_handler", sizeof("session.save_handler") - 1, 0);
1959+
ini_val = zend_string_init("user", sizeof("user") - 1, 0);
1960+
PS(set_handler) = 1;
1961+
zend_alter_ini_entry(ini_name, ini_val, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
1962+
PS(set_handler) = 0;
1963+
zend_string_release_ex(ini_val, 0);
1964+
zend_string_release_ex(ini_name, 0);
1965+
}
1966+
19551967
/* {{{ Sets user-level functions */
19561968
PHP_FUNCTION(session_set_save_handler)
19571969
{
19581970
zval *args = NULL;
19591971
int i, num_args, argc = ZEND_NUM_ARGS();
1960-
zend_string *ini_name, *ini_val;
19611972

19621973
if (argc > 0 && argc <= 2) {
19631974
zval *obj = NULL;
@@ -2052,13 +2063,7 @@ PHP_FUNCTION(session_set_save_handler)
20522063
}
20532064

20542065
if (PS(session_status) != php_session_active && (!PS(mod) || PS(mod) != &ps_mod_user)) {
2055-
ini_name = zend_string_init("session.save_handler", sizeof("session.save_handler") - 1, 0);
2056-
ini_val = zend_string_init("user", sizeof("user") - 1, 0);
2057-
PS(set_handler) = 1;
2058-
zend_alter_ini_entry(ini_name, ini_val, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
2059-
PS(set_handler) = 0;
2060-
zend_string_release_ex(ini_val, 0);
2061-
zend_string_release_ex(ini_name, 0);
2066+
set_user_save_handler_ini();
20622067
}
20632068

20642069
RETURN_TRUE;
@@ -2090,14 +2095,8 @@ PHP_FUNCTION(session_set_save_handler)
20902095
/* remove shutdown function */
20912096
remove_user_shutdown_function("session_shutdown", sizeof("session_shutdown") - 1);
20922097

2093-
if (PS(mod) && PS(mod) != &ps_mod_user) {
2094-
ini_name = zend_string_init("session.save_handler", sizeof("session.save_handler") - 1, 0);
2095-
ini_val = zend_string_init("user", sizeof("user") - 1, 0);
2096-
PS(set_handler) = 1;
2097-
zend_alter_ini_entry(ini_name, ini_val, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
2098-
PS(set_handler) = 0;
2099-
zend_string_release_ex(ini_val, 0);
2100-
zend_string_release_ex(ini_name, 0);
2098+
if (!PS(mod) || PS(mod) != &ps_mod_user) {
2099+
set_user_save_handler_ini();
21012100
}
21022101

21032102
for (i = 0; i < argc; i++) {

ext/session/tests/bug80889a.phpt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
--TEST--
2+
Bug #80889 (Cannot set save handler when save_handler is invalid)
3+
--SKIPIF--
4+
<?php include('skipif.inc'); ?>
5+
--INI--
6+
session.save_handler=whatever
7+
--FILE--
8+
<?php
9+
$initHandler = ini_get('session.save_handler');
10+
session_set_save_handler(
11+
function ($savePath, $sessionName) {
12+
return true;
13+
},
14+
function () {
15+
return true;
16+
},
17+
function ($id) {
18+
return '';
19+
},
20+
function ($id, $data) {
21+
return true;
22+
},
23+
function ($id) {
24+
return true;
25+
},
26+
function ($maxlifetime) {
27+
return true;
28+
}
29+
);
30+
$setHandler = ini_get('session.save_handler');
31+
var_dump($initHandler, $setHandler);
32+
?>
33+
--EXPECT--
34+
string(8) "whatever"
35+
string(4) "user"

0 commit comments

Comments
 (0)