Sophie

Sophie

distrib > Mandriva > mes5 > x86_64 > by-pkgid > b27a9804f8475618034d35341d729181 > files > 11

php-5.3.22-0.2mdvmes5.2.src.rpm

From 1b58bd39a637e9ec4ea9e95903b74aefdbd1b596 Mon Sep 17 00:00:00 2001
From: Xinchen Hui <laruence@php.net>
Date: Sun, 24 Feb 2013 12:55:46 +0800
Subject: [PATCH] Fixed bug #64264 (SPLFixedArray toArray problem)

---
 NEWS                        |  1 +
 ext/spl/spl_fixedarray.c    | 24 +++++++++++++-----------
 ext/spl/tests/bug64264.phpt | 29 +++++++++++++++++++++++++++++
 3 files changed, 43 insertions(+), 11 deletions(-)
 create mode 100644 ext/spl/tests/bug64264.phpt

#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
+)
-- 
1.7.11.5