Skip to content

Commit ed59370

Browse files
committed
Little improvement, update NEWs, added test
1 parent 1b5ad03 commit ed59370

File tree

3 files changed

+23
-9
lines changed

3 files changed

+23
-9
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ PHP NEWS
2121
. Fixed bug #68846 (False detection of CJK Unified Ideographs Extension E).
2222
(Masaki Kagaya)
2323

24+
- SPL:
25+
. Fixed #69227 (Use after free in zval_scan caused by
26+
spl_object_storage_get_gc). (adam dot scarr at 99designs dot com)
27+
2428
19 Mar 2015, PHP 5.5.23
2529

2630
- Core:

ext/spl/spl_observer.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ typedef struct _spl_SplObjectStorage { /* {{{ */
8787
zend_function *fptr_get_hash;
8888
HashTable *debug_info;
8989
zval **gcdata;
90-
long gcdata_len;
90+
long gcdata_num;
9191
} spl_SplObjectStorage; /* }}} */
9292

9393
/* {{{ storage is an assoc aray of [zend_object_value]=>[zval *obj, zval *inf] */
@@ -269,9 +269,6 @@ static zend_object_value spl_object_storage_new_ex(zend_class_entry *class_type,
269269
zend_object_std_init(&intern->std, class_type TSRMLS_CC);
270270
object_properties_init(&intern->std, class_type);
271271

272-
intern->gcdata = NULL;
273-
intern->gcdata_len = 0;
274-
275272
zend_hash_init(&intern->storage, 0, NULL, (void (*)(void *))spl_object_storage_dtor, 0);
276273

277274
retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t)zend_objects_destroy_object, (zend_objects_free_object_storage_t) spl_SplOjectStorage_free_storage, NULL TSRMLS_CC);
@@ -371,15 +368,14 @@ static HashTable* spl_object_storage_debug_info(zval *obj, int *is_temp TSRMLS_D
371368
/* overriden for garbage collection */
372369
static HashTable *spl_object_storage_get_gc(zval *obj, zval ***table, int *n TSRMLS_DC) /* {{{ */
373370
{
371+
long i = 0;
374372
spl_SplObjectStorage *intern = (spl_SplObjectStorage*)zend_object_store_get_object(obj TSRMLS_CC);
375373
spl_SplObjectStorageElement *element;
376374
HashPosition pos;
377-
long i = 0;
378-
long requiredLength = intern->storage.nNumOfElements * 2;
379375

380-
if (requiredLength > intern->gcdata_len) {
381-
intern->gcdata = (zval**)erealloc(intern->gcdata, sizeof(zval*) * requiredLength);
382-
intern->gcdata_len = requiredLength;
376+
if (intern->storage.nNumOfElements > intern->gcdata_num) {
377+
intern->gcdata_num = intern->storage.nNumOfElements * 2;
378+
intern->gcdata = (zval**)erealloc(intern->gcdata, sizeof(zval*) * intern->gcdata_num);
383379
}
384380

385381
zend_hash_internal_pointer_reset_ex(&intern->storage, &pos);

ext/spl/tests/bug69227.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
Bug #69227 (Use after free in zval_scan caused by spl_object_storage_get_gc)
3+
--INI--
4+
zend.enable_gc=1
5+
--FILE--
6+
<?php
7+
8+
$s = new SplObjectStorage();
9+
$s->attach($s);
10+
gc_collect_cycles();
11+
echo "ok";
12+
?>
13+
--EXPECT--
14+
ok

0 commit comments

Comments
 (0)