summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2018-10-08 13:14:54 +0200
committerNikita Popov <nikita.ppv@gmail.com>2018-10-08 13:16:23 +0200
commitd982bbe175b6f4487683f538f2dc8aca4aef4a6b (patch)
tree8d384f863cba9670ea84fa9869bc5f589367b644 /ext
parentc5df679ca8b1373e3f2a47aeba5b37da74f993de (diff)
downloadphp-git-d982bbe175b6f4487683f538f2dc8aca4aef4a6b.tar.gz
Fix ref ID handling when serializing $GLOBALS
This was already broken previously, but in PHP 7.3 stricter validation during unserialization made this into an error.
Diffstat (limited to 'ext')
-rw-r--r--ext/standard/tests/serialize/serialize_globals_var_refs.phpt22
-rw-r--r--ext/standard/var.c6
2 files changed, 25 insertions, 3 deletions
diff --git a/ext/standard/tests/serialize/serialize_globals_var_refs.phpt b/ext/standard/tests/serialize/serialize_globals_var_refs.phpt
new file mode 100644
index 0000000000..3f03cc2a21
--- /dev/null
+++ b/ext/standard/tests/serialize/serialize_globals_var_refs.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Reference IDs should be correctly generated when $GLOBALS is serialized
+--FILE--
+<?php
+
+$obj = new stdClass;
+$obj2 = new stdClass;
+$obj2->obj = $obj;
+$s = serialize($GLOBALS);
+$globals = unserialize($s);
+var_dump($obj);
+var_dump($obj2);
+
+?>
+--EXPECT--
+object(stdClass)#1 (0) {
+}
+object(stdClass)#2 (1) {
+ ["obj"]=>
+ object(stdClass)#1 (0) {
+ }
+}
diff --git a/ext/standard/var.c b/ext/standard/var.c
index e4c7932868..77b290a6cc 100644
--- a/ext/standard/var.c
+++ b/ext/standard/var.c
@@ -959,9 +959,9 @@ again:
/* we should still add element even if it's not OK,
* since we already wrote the length of the array before */
if (Z_TYPE_P(data) == IS_ARRAY) {
- if (Z_TYPE_P(data) == IS_ARRAY
- && (UNEXPECTED(Z_IS_RECURSIVE_P(data))
- || UNEXPECTED(Z_TYPE_P(struc) == IS_ARRAY && Z_ARR_P(data) == Z_ARR_P(struc)))) {
+ if (UNEXPECTED(Z_IS_RECURSIVE_P(data))
+ || UNEXPECTED(Z_TYPE_P(struc) == IS_ARRAY && Z_ARR_P(data) == Z_ARR_P(struc))) {
+ php_add_var_hash(var_hash, struc);
smart_str_appendl(buf, "N;", 2);
} else {
if (Z_REFCOUNTED_P(data)) {