diff options
author | Matt Wilmas <mattwil@php.net> | 2009-06-07 19:28:15 +0000 |
---|---|---|
committer | Matt Wilmas <mattwil@php.net> | 2009-06-07 19:28:15 +0000 |
commit | dca18b68d11308f94acec7e62336fce9ae8222c8 (patch) | |
tree | d0a6dc7bc1f980ec5a36e30080ccc20883413143 | |
parent | 2462fce2442c6904995c265f48c145e4c82d8e9f (diff) | |
download | php-git-dca18b68d11308f94acec7e62336fce9ae8222c8.tar.gz |
MFH: Fixed bug #47836 (array operator [] inconsistency when the array has PHP_INT_MAX index value)
Also simplified related array_push() test
-rw-r--r-- | Zend/tests/bug47836.phpt | 16 | ||||
-rw-r--r-- | Zend/zend_hash.c | 4 | ||||
-rw-r--r-- | ext/standard/tests/array/array_push_error2.phpt | 23 |
3 files changed, 22 insertions, 21 deletions
diff --git a/Zend/tests/bug47836.phpt b/Zend/tests/bug47836.phpt new file mode 100644 index 0000000000..5a93a44c71 --- /dev/null +++ b/Zend/tests/bug47836.phpt @@ -0,0 +1,16 @@ +--TEST-- +Bug #47836 (array operator [] inconsistency when the array has PHP_INT_MAX index value) +--FILE-- +<?php + +$arr[PHP_INT_MAX] = 1; +$arr[] = 2; + +var_dump($arr); +?> +--EXPECTF-- +Warning: Cannot add element to the array as the next element is already occupied in %s on line 4 +array(1) { + [%d]=> + int(1) +} diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index f960766535..e243d0fac7 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -376,7 +376,7 @@ ZEND_API int _zend_hash_index_update_or_next_insert(HashTable *ht, ulong h, void UPDATE_DATA(ht, p, pData, nDataSize); HANDLE_UNBLOCK_INTERRUPTIONS(); if ((long)h >= (long)ht->nNextFreeElement) { - ht->nNextFreeElement = h + 1; + ht->nNextFreeElement = h < LONG_MAX ? h + 1 : LONG_MAX; } if (pDest) { *pDest = p->pData; @@ -404,7 +404,7 @@ ZEND_API int _zend_hash_index_update_or_next_insert(HashTable *ht, ulong h, void HANDLE_UNBLOCK_INTERRUPTIONS(); if ((long)h >= (long)ht->nNextFreeElement) { - ht->nNextFreeElement = h + 1; + ht->nNextFreeElement = h < LONG_MAX ? h + 1 : LONG_MAX; } ht->nNumOfElements++; ZEND_HASH_IF_FULL_DO_RESIZE(ht); diff --git a/ext/standard/tests/array/array_push_error2.phpt b/ext/standard/tests/array/array_push_error2.phpt index e52c91caba..5d7b655a42 100644 --- a/ext/standard/tests/array/array_push_error2.phpt +++ b/ext/standard/tests/array/array_push_error2.phpt @@ -1,5 +1,5 @@ --TEST-- -Test array_push() function : error conditions - min and max int values as keys +Test array_push() function : error conditions - max int value as key --FILE-- <?php /* Prototype : int array_push(array $stack, mixed $var [, mixed $...]) @@ -8,42 +8,27 @@ Test array_push() function : error conditions - min and max int values as keys */ /* - * Use PHP's minimum and maximum integer values as array keys + * Use PHP's maximum integer value as array key * then try and push new elements onto the array */ echo "*** Testing array_push() : error conditions ***\n"; -$array = array(-PHP_INT_MAX => 'min', PHP_INT_MAX => 'max'); +$array = array(PHP_INT_MAX => 'max'); var_dump(array_push($array, 'new')); var_dump($array); -var_dump(array_push($array, 'var')); -var_dump($array); echo "Done"; ?> --EXPECTF-- *** Testing array_push() : error conditions *** -int(3) -array(3) { - [-%d]=> - string(3) "min" - [%d]=> - string(3) "max" - [-%d]=> - string(3) "new" -} Warning: array_push(): Cannot add element to the array as the next element is already occupied in %s on line %d bool(false) -array(3) { - [-%d]=> - string(3) "min" +array(1) { [%d]=> string(3) "max" - [-%d]=> - string(3) "new" } Done
\ No newline at end of file |