]> granicus.if.org Git - php/commitdiff
Fixed bug #47836 (array operator [] inconsistency when the array has PHP_INT_MAX...
authorMatt Wilmas <mattwil@php.net>
Sun, 7 Jun 2009 19:28:02 +0000 (19:28 +0000)
committerMatt Wilmas <mattwil@php.net>
Sun, 7 Jun 2009 19:28:02 +0000 (19:28 +0000)
Also simplified related array_push() test

Zend/tests/bug47836.phpt [new file with mode: 0644]
Zend/zend_hash.c
ext/standard/tests/array/array_push_error2.phpt

diff --git a/Zend/tests/bug47836.phpt b/Zend/tests/bug47836.phpt
new file mode 100644 (file)
index 0000000..5a93a44
--- /dev/null
@@ -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)
+}
index 5e4429e4fe292f28ccefaeb3379a2519f53b7074..cdb7eea896a40f5ff10a724e15f3e325695a01ae 100644 (file)
@@ -507,7 +507,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;
@@ -537,7 +537,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);
index 4e0aad084827514923a06424011482890defbbfa..839b378f370c63b7f5e415582dae5804ac3515ca 100644 (file)
@@ -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]=>
-  unicode(3) "min"
-  [%d]=>
-  unicode(3) "max"
-  [-%d]=>
-  unicode(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]=>
-  unicode(3) "min"
+array(1) {
   [%d]=>
   unicode(3) "max"
-  [-%d]=>
-  unicode(3) "new"
 }
 Done