com php-src: Fixed bug #64264 (SPLFixedArray toArray problem): NEWS ext/spl/spl_fixedarray.c ext/spl/tests/bug64264 .phpt
| From: | Xinchen Hui | Date: | Sun, 24 Feb 2013 04:55:53 +0000 |
| Subject: | com php-src: Fixed bug #64264 (SPLFixedArray toArray problem): NEWS ext/spl/spl_fixedarray.c ext/spl/tests/bug64264 .phpt | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-71316@lists.php.net to get a copy of this message | ||
Commit: 1b58bd39a637e9ec4ea9e95903b74aefdbd1b596
Author: Xinchen Hui <laruence@php.net> Sun, 24 Feb 2013 12:55:46 +0800
Parents: fcd4b5335a6df4e0676ee32e2267ca71d70fe623
Branches: PHP-5.3
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=1b58bd39a637e9ec4ea9e95903b74aefdbd1b596
Log:
Fixed bug #64264 (SPLFixedArray toArray problem)
Bugs:
https://bugs.php.net/64264
Changed paths:
M NEWS
M ext/spl/spl_fixedarray.c
A ext/spl/tests/bug64264.phpt
Diff:
diff --git a/NEWS b/NEWS
index 0242cff..a298c55 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,7 @@ PHP NEWS
?? ??? 2013, PHP 5.3.23
- SPL:
+ . Fixed bug #64264 (SPLFixedArray toArray problem). (Laruence)
. Fixed bug #64228 (RecursiveDirectoryIterator always assumes SKIP_DOTS).
(patch by kriss@krizalys.com, Laruence)
diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c
index 1d18afd..646c002 100644
--- a/ext/spl/spl_fixedarray.c
+++ b/ext/spl/spl_fixedarray.c
@@ -611,8 +611,6 @@ SPL_METHOD(SplFixedArray, count)
SPL_METHOD(SplFixedArray, toArray)
{
spl_fixedarray_object *intern;
- zval *ret, *tmp;
- HashTable *ret_ht, *obj_ht;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "")) {
return;
@@ -620,15 +618,19 @@ SPL_METHOD(SplFixedArray, toArray)
intern = (spl_fixedarray_object *)zend_object_store_get_object(getThis() TSRMLS_CC);
- ALLOC_HASHTABLE(ret_ht);
- zend_hash_init(ret_ht, 0, NULL, ZVAL_PTR_DTOR, 0);
- ALLOC_INIT_ZVAL(ret);
- Z_TYPE_P(ret) = IS_ARRAY;
- obj_ht = spl_fixedarray_object_get_properties(getThis() TSRMLS_CC);
- zend_hash_copy(ret_ht, obj_ht, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval
*));
- Z_ARRVAL_P(ret) = ret_ht;
-
- RETURN_ZVAL(ret, 1, 1);
+ array_init(return_value);
+ if (intern->array) {
+ int i = 0;
+ for (; i < intern->array->size; i++) {
+ if (intern->array->elements[i]) {
+ zend_hash_index_update(Z_ARRVAL_P(return_value), i, (void
*)&intern->array->elements[i], sizeof(zval *), NULL);
+ Z_ADDREF_P(intern->array->elements[i]);
+ } else {
+ zend_hash_index_update(Z_ARRVAL_P(return_value), i, (void *)&EG(uninitialized_zval_ptr),
sizeof(zval *), NULL);
+ Z_ADDREF_P(EG(uninitialized_zval_ptr));
+ }
+ }
+ }
}
/* }}} */
diff --git a/ext/spl/tests/bug64264.phpt b/ext/spl/tests/bug64264.phpt
new file mode 100644
index 0000000..e7b695b
--- /dev/null
+++ b/ext/spl/tests/bug64264.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Bug #64264 (SPLFixedArray toArray problem)
+--FILE--
+<?php
+class MyFixedArray extends \SplFixedArray {
+ protected $foo;
+ protected $bar;
+}
+
+$myFixedArr = new MyFixedArray(1);
+$myFixedArr[0] = 'foo';
+$myFixedArr->setSize(2);
+$myFixedArr[1] = 'bar';
+$myFixedArr->setSize(5);
+$array = $myFixedArr->toArray();
+$array[2] = "ERROR";
+$array[3] = "ERROR";
+$array[4] = "ERROR";
+unset($array[4]);
+$myFixedArr->setSize(2);
+
+print_r($myFixedArr->toArray());
+?>
+--EXPECTF--
+Array
+(
+ [0] => foo
+ [1] => bar
+)