Skip to content

Commit ffdc572

Browse files
committed
Fixed bug #69108 ("Segmentation fault" when (de)serializing SplObjectStorage)
1 parent 1bfbb54 commit ffdc572

File tree

3 files changed

+25
-0
lines changed

3 files changed

+25
-0
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ PHP NEWS
3636
parameters). (Laruence)
3737

3838
- SPL:
39+
. Fixed bug #69108 ("Segmentation fault" when (de)serializing
40+
SplObjectStorage). (Laruence)
3941
. Fixed bug #68557 (RecursiveDirectoryIterator::seek(0) broken after
4042
calling getChildren()). (Julien)
4143

ext/spl/spl_observer.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,7 @@ SPL_METHOD(SplObjectStorage, serialize)
782782
INIT_PZVAL(&members);
783783
Z_ARRVAL(members) = zend_std_get_properties(getThis() TSRMLS_CC);
784784
Z_TYPE(members) = IS_ARRAY;
785+
zend_hash_del(Z_ARRVAL(members), "\x00gcdata", sizeof("\x00gcdata"));
785786
pmembers = &members;
786787
php_var_serialize(&buf, &pmembers, &var_hash TSRMLS_CC); /* finishes the string */
787788

ext/spl/tests/bug69108.phpt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
Bug #69108 ("Segmentation fault" when (de)serializing SplObjectStorage)
3+
--INI--
4+
zend.enable_gc=1
5+
--FILE--
6+
<?php
7+
$a = array();
8+
$b = new SplObjectStorage();
9+
for ($i = 10000; $i > 0; $i--) {
10+
$object = new StdClass();
11+
$a[] = $object;
12+
$b->attach($object);
13+
}
14+
15+
$c = serialize(array($a, $b));
16+
$d = unserialize($c);
17+
18+
unset($d);
19+
echo "ok";
20+
?>
21+
--EXPECT--
22+
ok

0 commit comments

Comments
 (0)