File tree Expand file tree Collapse file tree 3 files changed +16
-21
lines changed Expand file tree Collapse file tree 3 files changed +16
-21
lines changed Original file line number Diff line number Diff line change @@ -245,11 +245,18 @@ static zend_string *php_session_encode(void) /* {{{ */
245
245
246
246
static int php_session_decode (zend_string * data ) /* {{{ */
247
247
{
248
+ int res ;
248
249
if (!PS (serializer )) {
249
250
php_error_docref (NULL , E_WARNING , "Unknown session.serialize_handler. Failed to decode session object" );
250
251
return FAILURE ;
251
252
}
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 ) {
253
260
php_session_destroy ();
254
261
php_session_track_init ();
255
262
php_error_docref (NULL , E_WARNING , "Failed to decode session object. Session has been destroyed" );
Original file line number Diff line number Diff line change @@ -4,8 +4,6 @@ Bug #70219 Use after free vulnerability in session deserializer
4
4
<?php
5
5
if (!extension_loaded ('session ' )) die ('skip session extension not available ' );
6
6
?>
7
- --XFAIL--
8
- Unfinished merge, needs fix.
9
7
--FILE--
10
8
<?php
11
9
class obj implements Serializable {
@@ -32,15 +30,6 @@ var_dump($data);
32
30
?>
33
31
--EXPECTF--
34
32
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)
Original file line number Diff line number Diff line change @@ -18,6 +18,7 @@ class obj implements Serializable {
18
18
}
19
19
function unserialize ($ data ) {
20
20
session_decode ($ data );
21
+ return null ;
21
22
}
22
23
}
23
24
@@ -33,20 +34,18 @@ for ($i = 0; $i < 5; $i++) {
33
34
var_dump ($ data );
34
35
var_dump ($ _SESSION );
35
36
?>
36
- --EXPECTF --
37
+ --EXPECT --
37
38
array(2) {
38
39
[0]=>
39
- object(obj)#%d (1) {
40
+ object(obj)#1 (1) {
40
41
["data"]=>
41
42
NULL
42
43
}
43
44
[1]=>
44
- object(obj)#%d (1) {
45
+ object(obj)#2 (1) {
45
46
["data"]=>
46
47
NULL
47
48
}
48
49
}
49
- object(obj)#1 (1) {
50
- ["data"]=>
51
- NULL
50
+ array(0) {
52
51
}
You can’t perform that action at this time.
0 commit comments