mirror of
https://github.com/php/php-src.git
synced 2024-09-22 10:27:25 +00:00
Fixed bug #45614 (ArrayIterator::current(), ::key() can show 1st private prop of wrapped object)
This commit is contained in:
parent
c3ecda4dfd
commit
2db33d3d7f
@ -87,6 +87,8 @@ static inline HashTable *spl_array_get_hash_table(spl_array_object* intern, int
|
||||
}
|
||||
} /* }}} */
|
||||
|
||||
static void spl_array_rewind(spl_array_object *intern TSRMLS_DC);
|
||||
|
||||
SPL_API int spl_hash_verify_pos(spl_array_object * intern TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
HashTable *ht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
|
||||
@ -103,7 +105,7 @@ SPL_API int spl_hash_verify_pos(spl_array_object * intern TSRMLS_DC) /* {{{ */
|
||||
p = p->pListNext;
|
||||
}
|
||||
/* HASH_UNPROTECT_RECURSION(ht); */
|
||||
zend_hash_internal_pointer_reset_ex(spl_array_get_hash_table(intern, 0 TSRMLS_CC), &intern->pos);
|
||||
spl_array_rewind(intern TSRMLS_CC);
|
||||
return FAILURE;
|
||||
}
|
||||
/* }}} */
|
||||
@ -227,7 +229,7 @@ static zend_object_value spl_array_object_new_ex(zend_class_entry *class_type, s
|
||||
}
|
||||
}
|
||||
|
||||
zend_hash_internal_pointer_reset_ex(spl_array_get_hash_table(intern, 0 TSRMLS_CC), &intern->pos);
|
||||
spl_array_rewind(intern TSRMLS_CC);
|
||||
return retval;
|
||||
}
|
||||
/* }}} */
|
||||
@ -707,8 +709,6 @@ static int spl_array_has_property(zval *object, zval *member, int has_set_exists
|
||||
return std_object_handlers.has_property(object, member, has_set_exists TSRMLS_CC);
|
||||
} /* }}} */
|
||||
|
||||
static void spl_array_rewind(spl_array_object *intern TSRMLS_DC);
|
||||
|
||||
static void spl_array_unset_property(zval *object, zval *member TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
@ -1157,7 +1157,7 @@ SPL_METHOD(Array, seek)
|
||||
opos = position;
|
||||
|
||||
if (position >= 0) { /* negative values are not supported */
|
||||
zend_hash_internal_pointer_reset_ex(aht, &intern->pos);
|
||||
spl_array_rewind(intern TSRMLS_CC);
|
||||
result = SUCCESS;
|
||||
|
||||
while (position-- > 0 && (result = spl_array_next(intern TSRMLS_CC)) == SUCCESS);
|
||||
@ -1185,7 +1185,7 @@ int static spl_array_object_count_elements_helper(spl_array_object *intern, long
|
||||
* we're going to call and which do not support 'pos' as parameter. */
|
||||
pos = intern->pos;
|
||||
*count = 0;
|
||||
zend_hash_internal_pointer_reset_ex(aht, &intern->pos);
|
||||
spl_array_rewind(intern TSRMLS_CC);
|
||||
while(intern->pos && spl_array_next(intern TSRMLS_CC) == SUCCESS) {
|
||||
(*count)++;
|
||||
}
|
||||
|
56
ext/spl/tests/bug45614.phpt
Normal file
56
ext/spl/tests/bug45614.phpt
Normal file
@ -0,0 +1,56 @@
|
||||
--TEST--
|
||||
SPL: Bug#45614 (ArrayIterator can show 1st private prop of wrapped object)
|
||||
--FILE--
|
||||
<?php
|
||||
class C {
|
||||
private $priv1 = 'secret1';
|
||||
private $priv2 = 'secret2';
|
||||
public $pub1 = 'public1';
|
||||
public $pub2 = 'public2';
|
||||
public $pub3 = 'public3';
|
||||
}
|
||||
|
||||
function showFirstTwoItems($it) {
|
||||
echo str_replace("\0", '\0', $it->key()) . " => " . $it->current() .
|
||||
"\n";
|
||||
$it->next();
|
||||
echo str_replace("\0", '\0', $it->key()) . " => " . $it->current() .
|
||||
"\n";
|
||||
}
|
||||
|
||||
$ao = new ArrayObject(new C);
|
||||
$ai = $ao->getIterator();
|
||||
|
||||
echo "--> Show the first two items:\n";
|
||||
showFirstTwoItems($ai);
|
||||
|
||||
echo "\n--> Rewind and show the first two items:\n";
|
||||
$ai->rewind();
|
||||
showFirstTwoItems($ai);
|
||||
|
||||
echo "\n--> Invalidate current position and show the first two items:\n";
|
||||
unset($ai[$ai->key()]);
|
||||
$ai->current();
|
||||
showFirstTwoItems($ai);
|
||||
|
||||
echo "\n--> Rewind, seek and show the first two items:\n";
|
||||
$ai->rewind();
|
||||
$ai->seek(0);
|
||||
showFirstTwoItems($ai);
|
||||
?>
|
||||
--EXPECT--
|
||||
--> Show the first two items:
|
||||
pub1 => public1
|
||||
pub2 => public2
|
||||
|
||||
--> Rewind and show the first two items:
|
||||
pub1 => public1
|
||||
pub2 => public2
|
||||
|
||||
--> Invalidate current position and show the first two items:
|
||||
pub1 => public1
|
||||
pub3 => public3
|
||||
|
||||
--> Rewind, seek and show the first two items:
|
||||
pub1 => public1
|
||||
pub3 => public3
|
Loading…
Reference in New Issue
Block a user