Skip to content

Commit c6df6fb

Browse files
committed
__sleep too
1 parent 8ef02b7 commit c6df6fb

File tree

3 files changed

+52
-3
lines changed

3 files changed

+52
-3
lines changed

ext/standard/tests/serialize/gh12265.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
--TEST--
2-
GH-12265 (Cloning an object breaks serialization recursion)
2+
GH-12265 (Cloning an object breaks serialization recursion) - __serialize variation
33
--FILE--
44
<?php
55

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
--TEST--
2+
GH-12265 (Cloning an object breaks serialization recursion) - __sleep variation
3+
--FILE--
4+
<?php
5+
6+
class A {
7+
public function __construct(public B $x) {
8+
}
9+
}
10+
11+
class B {
12+
public A $a;
13+
14+
public function __sleep()
15+
{
16+
$this->a = new A($this);
17+
return ['a'];
18+
}
19+
}
20+
21+
class C {
22+
public B $b;
23+
24+
public function __construct() {
25+
$this->b = new B;
26+
}
27+
}
28+
29+
$b = new B();
30+
$sb = serialize($b);
31+
$stb = serialize(new B);
32+
33+
printf("serialized original: %s\n", $sb);
34+
printf("serialized temp : %s\n", $stb);
35+
36+
$c = new C;
37+
$sc = serialize($c);
38+
$stc = serialize(new C);
39+
40+
printf("serialized original: %s\n", $sc);
41+
printf("serialized temp : %s\n", $stc);
42+
43+
?>
44+
--EXPECT--
45+
serialized original: O:1:"B":1:{s:1:"a";O:1:"A":1:{s:1:"x";r:1;}}
46+
serialized temp : O:1:"B":1:{s:1:"a";O:1:"A":1:{s:1:"x";r:1;}}
47+
serialized original: O:1:"C":1:{s:1:"b";O:1:"B":1:{s:1:"a";O:1:"A":1:{s:1:"x";r:2;}}}
48+
serialized temp : O:1:"C":1:{s:1:"b";O:1:"B":1:{s:1:"a";O:1:"A":1:{s:1:"x";r:2;}}}

ext/standard/var.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -682,8 +682,9 @@ static inline zend_long php_add_var_hash(php_serialize_data_t data, zval *var, b
682682
} else if (!in_rcn_array
683683
&& Z_REFCOUNT_P(var) == 1
684684
&& (Z_OBJ_P(var)->properties == NULL || GC_REFCOUNT(Z_OBJ_P(var)->properties) == 1)
685-
/* __serialize may arbitrarily increase the refcount */
686-
&& Z_OBJCE_P(var)->__serialize == NULL) {
685+
/* __serialize and __sleep may arbitrarily increase the refcount */
686+
&& Z_OBJCE_P(var)->__serialize == NULL
687+
&& zend_hash_find_known_hash(&Z_OBJCE_P(var)->function_table, ZSTR_KNOWN(ZEND_STR_SLEEP)) == NULL) {
687688
return 0;
688689
}
689690

0 commit comments

Comments
 (0)