Skip to content

Commit

Permalink
Check for zero-length keys in spl_array_skip_protected and don't skip…
Browse files Browse the repository at this point in the history
… them.

Fixes bug #67360 (Missing element after ArrayObject::getIterator).
  • Loading branch information
LawnGnome committed May 29, 2014
1 parent d2765e4 commit b5d9983
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 1 deletion.
3 changes: 3 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ PHP NEWS
. Fixed bug #67308 (Serialize of DateTime truncates fractions of second).
(Adam)

- SPL:
. Fixed bug #67360 (Missing element after ArrayObject::getIterator). (Adam)

?? ??? 2014, PHP 5.4.29

- COM:
Expand Down
9 changes: 8 additions & 1 deletion ext/spl/spl_array.c
Original file line number Diff line number Diff line change
Expand Up @@ -922,7 +922,14 @@ static int spl_array_skip_protected(spl_array_object *intern, HashTable *aht TSR
if (Z_TYPE_P(intern->array) == IS_OBJECT) {
do {
if (zend_hash_get_current_key_ex(aht, &string_key, &string_length, &num_key, 0, &intern->pos) == HASH_KEY_IS_STRING) {
if (!string_length || string_key[0]) {
/* zend_hash_get_current_key_ex() should never set
* string_length to 0 when returning HASH_KEY_IS_STRING, but we
* may as well be defensive and consider that successful.
* Beyond that, we're looking for protected keys (which will
* have a null byte at string_key[0]), but want to avoid
* skipping completely empty keys (which will also have the
* null byte, but a string_length of 1). */
if (!string_length || string_key[0] || string_length == 1) {
return SUCCESS;
}
} else {
Expand Down
34 changes: 34 additions & 0 deletions ext/spl/tests/bug67360.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
--TEST--
Bug #67360 (Missing element after ArrayObject::getIterator)
--FILE--
<?php

$array = array('' => 1, 1 => 2, 3 => 4);
$ArrayObject = new ArrayObject($array);
var_dump($ArrayObject);
$Iterator = $ArrayObject->getIterator();
var_dump(count($Iterator) === count($array));
var_dump(iterator_to_array($Iterator));

?>
--EXPECTF--
object(ArrayObject)#%d (1) {
["storage":"ArrayObject":private]=>
array(3) {
[""]=>
int(1)
[1]=>
int(2)
[3]=>
int(4)
}
}
bool(true)
array(3) {
[""]=>
int(1)
[1]=>
int(2)
[3]=>
int(4)
}

0 comments on commit b5d9983

Please sign in to comment.