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) /* {{{ */
245245
246246static 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" );
Original file line number Diff line number Diff line change @@ -4,8 +4,6 @@ Bug #70219 Use after free vulnerability in session deserializer
44<?php
55if (!extension_loaded ('session ' )) die ('skip session extension not available ' );
66?>
7- --XFAIL--
8- Unfinished merge, needs fix.
97--FILE--
108<?php
119class obj implements Serializable {
@@ -32,15 +30,6 @@ var_dump($data);
3230?>
3331--EXPECTF--
3432Warning: 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 {
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++) {
3334var_dump ($ data );
3435var_dump ($ _SESSION );
3536?>
36- --EXPECTF --
37+ --EXPECT --
3738array(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}
You can’t perform that action at this time.
0 commit comments