From: Marcus Boerger Date: Thu, 29 Apr 2004 22:25:45 +0000 (+0000) Subject: - ArrayObject::append() must not be called when it refers to an object X-Git-Tag: RELEASE_0_1~330 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=74f21310e359d067ee9d941cdda0c035c9e87d8d;p=php - ArrayObject::append() must not be called when it refers to an object --- diff --git a/ext/spl/examples/appenditerator.inc b/ext/spl/examples/appenditerator.inc index 48cc439ee3..df24869755 100755 --- a/ext/spl/examples/appenditerator.inc +++ b/ext/spl/examples/appenditerator.inc @@ -18,11 +18,6 @@ class AppendIterator implements Iterator function append(Iterator $it) { $this->iterators->append($it); - if (!$this->valid()) - { - $this->iterators->seek($this->iterators->count() - 1); - $this->iterators->current()->rewind(); - } } function getInnerIterator() diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 73063fe95d..67f39830cb 100755 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -361,14 +361,31 @@ SPL_METHOD(Array, offsetSet) } /* }}} */ /* {{{ proto bool ArrayObject::append(mixed $newval) - Appends the value. */ + Appends the value (cannot be called for objects). */ SPL_METHOD(Array, append) { + zval *object = getThis(); + spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC); + HashTable *aht = HASH_OF(intern->array); + zval *value; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == FAILURE) { return; } - spl_array_write_dimension(getThis(), NULL, value TSRMLS_CC); + + if (!aht) { + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified outside object and is no longer an array"); + return; + } + + if (Z_TYPE_P(intern->array) == IS_OBJECT) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Cannot append properties to objects, use %s::offsetSet() instead", Z_OBJCE_P(object)->name); + } + + spl_array_write_dimension(object, NULL, value TSRMLS_CC); + if (!intern->pos) { + intern->pos = aht->pListTail; + } } /* }}} */ /* {{{ proto bool ArrayObject::offsetUnset(mixed $index) diff --git a/ext/spl/tests/array_013.phpt b/ext/spl/tests/array_013.phpt new file mode 100755 index 0000000000..6d74bcb419 --- /dev/null +++ b/ext/spl/tests/array_013.phpt @@ -0,0 +1,81 @@ +--TEST-- +SPL: ArrayIterator::append +--SKIPIF-- + +--FILE-- + 'zero', 1 => 'one', 2 => 'two'); +$it = new ArrayIterator($a); + +foreach($it as $key => $val) +{ + echo "$key=>$val\n"; +} + +echo "===Append===\n"; + +$it->append('three'); +$it->append('four'); + +foreach(new NoRewindIterator($it) as $key => $val) +{ + echo "$key=>$val\n"; +} + +echo "===Object===\n"; + +class test +{ + public $zero = 0; + protected $pro; + public $one = 1; + private $pri; + public $two = 2; +} + +$o = new test; +$it = new ArrayIterator($o); + +foreach($it as $key => $val) +{ + echo "$key=>$val\n"; +} + +echo "===Append===\n"; + +$it->append('three'); +$it->append('four'); + +foreach(new NoRewindIterator($it) as $key => $val) +{ + echo "$key=>$val\n"; +} + +var_dump($o->{0}); /* doesn't wotk anyway */ + +?> +===DONE=== + +--EXPECTF-- +===Array=== +0=>zero +1=>one +2=>two +===Append=== +3=>three +4=>four +===Object=== +zero=>0 +one=>1 +two=>2 +===Append=== + +Fatal error: ArrayIterator::append(): Cannot append properties to objects, use ArrayIterator::offsetSet() instead in %sarray_013.php on line %d