File tree Expand file tree Collapse file tree 2 files changed +13
-7
lines changed Expand file tree Collapse file tree 2 files changed +13
-7
lines changed Original file line number Diff line number Diff line change @@ -244,11 +244,18 @@ static zend_string *php_session_encode(void) /* {{{ */
244
244
245
245
static int php_session_decode (zend_string * data ) /* {{{ */
246
246
{
247
+ int res ;
247
248
if (!PS (serializer )) {
248
249
php_error_docref (NULL , E_WARNING , "Unknown session.serialize_handler. Failed to decode session object" );
249
250
return FAILURE ;
250
251
}
251
- if (PS (serializer )-> decode (ZSTR_VAL (data ), ZSTR_LEN (data )) == FAILURE ) {
252
+ /* Make sure that any uses of unserialize() during session decoding do not share
253
+ * state with any unserialize() that is already in progress (e.g. because we are
254
+ * currently inside Serializable::unserialize(). */
255
+ BG (serialize_lock )++ ;
256
+ res = PS (serializer )-> decode (ZSTR_VAL (data ), ZSTR_LEN (data ));
257
+ BG (serialize_lock )-- ;
258
+ if (res == FAILURE ) {
252
259
php_session_destroy ();
253
260
php_session_track_init ();
254
261
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 @@ -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