Skip to content

Commit fb60ccc

Browse files
committed
Merge branch 'PHP-7.4'
2 parents de6b768 + b8ef7c3 commit fb60ccc

File tree

3 files changed

+16
-21
lines changed

3 files changed

+16
-21
lines changed

ext/session/session.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,11 +245,18 @@ static zend_string *php_session_encode(void) /* {{{ */
245245

246246
static int php_session_decode(zend_string *data) /* {{{ */
247247
{
248+
int res;
248249
if (!PS(serializer)) {
249250
php_error_docref(NULL, E_WARNING, "Unknown session.serialize_handler. Failed to decode session object");
250251
return FAILURE;
251252
}
252-
if (PS(serializer)->decode(ZSTR_VAL(data), ZSTR_LEN(data)) == FAILURE) {
253+
/* Make sure that any uses of unserialize() during session decoding do not share
254+
* state with any unserialize() that is already in progress (e.g. because we are
255+
* currently inside Serializable::unserialize(). */
256+
BG(serialize_lock)++;
257+
res = PS(serializer)->decode(ZSTR_VAL(data), ZSTR_LEN(data));
258+
BG(serialize_lock)--;
259+
if (res == FAILURE) {
253260
php_session_destroy();
254261
php_session_track_init();
255262
php_error_docref(NULL, E_WARNING, "Failed to decode session object. Session has been destroyed");

ext/standard/tests/serialize/bug70219.phpt

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ Bug #70219 Use after free vulnerability in session deserializer
44
<?php
55
if (!extension_loaded('session')) die('skip session extension not available');
66
?>
7-
--XFAIL--
8-
Unfinished merge, needs fix.
97
--FILE--
108
<?php
119
class obj implements Serializable {
@@ -32,15 +30,6 @@ var_dump($data);
3230
?>
3331
--EXPECTF--
3432
Warning: session_decode(): Failed to decode session object. Session has been destroyed in %s on line %d
35-
array(2) {
36-
[0]=>
37-
object(obj)#%d (1) {
38-
["data"]=>
39-
NULL
40-
}
41-
[1]=>
42-
&array(1) {
43-
["data"]=>
44-
NULL
45-
}
46-
}
33+
34+
Notice: unserialize(): Error at offset 55 of 56 bytes in %s on line %d
35+
bool(false)

ext/standard/tests/serialize/bug70219_1.phpt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class obj implements Serializable {
1818
}
1919
function unserialize($data) {
2020
session_decode($data);
21+
return null;
2122
}
2223
}
2324

@@ -33,20 +34,18 @@ for ($i = 0; $i < 5; $i++) {
3334
var_dump($data);
3435
var_dump($_SESSION);
3536
?>
36-
--EXPECTF--
37+
--EXPECT--
3738
array(2) {
3839
[0]=>
39-
object(obj)#%d (1) {
40+
object(obj)#1 (1) {
4041
["data"]=>
4142
NULL
4243
}
4344
[1]=>
44-
object(obj)#%d (1) {
45+
object(obj)#2 (1) {
4546
["data"]=>
4647
NULL
4748
}
4849
}
49-
object(obj)#1 (1) {
50-
["data"]=>
51-
NULL
50+
array(0) {
5251
}

0 commit comments

Comments
 (0)