summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Wilmas <mattwil@php.net>2009-06-07 19:28:15 +0000
committerMatt Wilmas <mattwil@php.net>2009-06-07 19:28:15 +0000
commitdca18b68d11308f94acec7e62336fce9ae8222c8 (patch)
treed0a6dc7bc1f980ec5a36e30080ccc20883413143
parent2462fce2442c6904995c265f48c145e4c82d8e9f (diff)
downloadphp-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.phpt16
-rw-r--r--Zend/zend_hash.c4
-rw-r--r--ext/standard/tests/array/array_push_error2.phpt23
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