Skip to content

Commit 0a55764

Browse files
committed
Fix GH-12265: Cloning an object breaks serialization recursion
1 parent 4f044e9 commit 0a55764

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
--TEST--
2+
GH-12265 (Cloning an object breaks serialization recursion)
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 __serialize()
15+
{
16+
return ['a' => new A($this)];
17+
}
18+
}
19+
20+
class C {
21+
public B $b;
22+
23+
public function __construct() {
24+
$this->b = new B;
25+
}
26+
}
27+
28+
$b = new B();
29+
$sb = serialize($b);
30+
$stb = serialize(new B);
31+
32+
printf("serialized original: %s\n", $sb);
33+
printf("serialized temp : %s\n", $stb);
34+
35+
$c = new C;
36+
$sc = serialize($c);
37+
$stc = serialize(new C);
38+
39+
printf("serialized original: %s\n", $sc);
40+
printf("serialized temp : %s\n", $stc);
41+
42+
?>
43+
--EXPECT--
44+
serialized original: O:1:"B":1:{s:1:"a";O:1:"A":1:{s:1:"x";r:1;}}
45+
serialized temp : O:1:"B":1:{s:1:"a";O:1:"A":1:{s:1:"x";r:1;}}
46+
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;}}}
47+
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 & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -671,7 +671,9 @@ static inline zend_long php_add_var_hash(php_serialize_data_t data, zval *var, b
671671
return 0;
672672
} else if (!in_rcn_array
673673
&& Z_REFCOUNT_P(var) == 1
674-
&& (Z_OBJ_P(var)->properties == NULL || GC_REFCOUNT(Z_OBJ_P(var)->properties) == 1)) {
674+
&& (Z_OBJ_P(var)->properties == NULL || GC_REFCOUNT(Z_OBJ_P(var)->properties) == 1)
675+
/* __serialize may arbitrarily increase the refcount */
676+
&& Z_OBJCE_P(var)->__serialize == NULL) {
675677
return 0;
676678
}
677679

0 commit comments

Comments
 (0)