Skip to content

Commit 06bfada

Browse files
committed
Fix #80889: Cannot set save handler when save_handler is invalid
There is no need to require a (valid) save_handler to be set, when a user handler is supposed to be set. We just have to make sure, that no user handler is already set in this case. Closes GH-6788.
1 parent bccca0b commit 06bfada

File tree

3 files changed

+42
-1
lines changed

3 files changed

+42
-1
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ PHP NEWS
99
. Fixed bug #80783 (PDO ODBC truncates BLOB records at every 256th byte).
1010
(cmb)
1111

12+
- Session:
13+
. Fixed bug #80889 (Cannot set save handler when save_handler is invalid).
14+
(cmb)
15+
1216
01 Apr 2021, PHP 7.4.17
1317

1418
- Core:

ext/session/session.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2031,7 +2031,7 @@ static PHP_FUNCTION(session_set_save_handler)
20312031
remove_user_shutdown_function("session_shutdown", sizeof("session_shutdown") - 1);
20322032
}
20332033

2034-
if (PS(mod) && PS(session_status) != php_session_active && PS(mod) != &ps_mod_user) {
2034+
if (PS(session_status) != php_session_active && (!PS(mod) || PS(mod) != &ps_mod_user)) {
20352035
ini_name = zend_string_init("session.save_handler", sizeof("session.save_handler") - 1, 0);
20362036
ini_val = zend_string_init("user", sizeof("user") - 1, 0);
20372037
PS(set_handler) = 1;

ext/session/tests/bug80889.phpt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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+
class DummyHandler implements SessionHandlerInterface {
10+
public function open($savePath, $sessionName) {
11+
return true;
12+
}
13+
public function close() {
14+
return true;
15+
}
16+
public function read($id) {
17+
return '';
18+
}
19+
public function write($id, $data) {
20+
return true;
21+
}
22+
public function destroy($id) {
23+
return true;
24+
}
25+
public function gc($maxlifetime) {
26+
return true;
27+
}
28+
}
29+
30+
$initHandler = ini_get('session.save_handler');
31+
session_set_save_handler(new DummyHandler());
32+
$setHandler = ini_get('session.save_handler');
33+
var_dump($initHandler, $setHandler);
34+
?>
35+
--EXPECT--
36+
string(8) "whatever"
37+
string(4) "user"

0 commit comments

Comments
 (0)