Skip to content

Commit bb0b4eb

Browse files
committed
Fix infiniry recursion during serialize() of "tricky" object
Fixes oss-fuzz #44954
1 parent aced867 commit bb0b4eb

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
--TEST--
2+
Object serialization / unserialization: circular object with rc=1
3+
--FILE--
4+
<?php
5+
$t=new stdClass;
6+
$t->y=$t;
7+
$y=(array)$t;
8+
unset($t);
9+
var_dump($y);
10+
$s=serialize($y);
11+
var_dump($s);
12+
$x=unserialize($s);
13+
var_dump($x);
14+
vaR_dump(serialize($x));
15+
?>
16+
--EXPECTF--
17+
array(1) {
18+
["y"]=>
19+
object(stdClass)#%d (1) {
20+
["y"]=>
21+
*RECURSION*
22+
}
23+
}
24+
string(45) "a:1:{s:1:"y";O:8:"stdClass":1:{s:1:"y";r:2;}}"
25+
array(1) {
26+
["y"]=>
27+
object(stdClass)#%d (1) {
28+
["y"]=>
29+
*RECURSION*
30+
}
31+
}
32+
string(45) "a:1:{s:1:"y";O:8:"stdClass":1:{s:1:"y";r:2;}}"

ext/standard/var.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,11 @@ static inline zend_long php_add_var_hash(php_serialize_data_t data, zval *var) /
662662

663663
data->n += 1;
664664

665-
if (!is_ref && (Z_TYPE_P(var) != IS_OBJECT || Z_REFCOUNT_P(var) == 1)) {
665+
if (is_ref) {
666+
/* pass */
667+
} else if (Z_TYPE_P(var) != IS_OBJECT) {
668+
return 0;
669+
} else if (Z_REFCOUNT_P(var) == 1 && (Z_OBJ_P(var)->properties == NULL || GC_REFCOUNT(Z_OBJ_P(var)->properties) == 1)) {
666670
return 0;
667671
}
668672

0 commit comments

Comments
 (0)