helly           Mon Aug 11 16:19:19 2003 EDT

  Added files:                 (Branch: PHP_4_3)
    /php-src/ext/standard/tests/array   bug21918.phpt 

  Modified files:              
    /Zend       zend_hash.c 
  Log:
  MFH: Bugfix 21918
  
Index: Zend/zend_hash.c
diff -u Zend/zend_hash.c:1.87.4.2 Zend/zend_hash.c:1.87.4.3
--- Zend/zend_hash.c:1.87.4.2   Tue Dec 31 11:23:02 2002
+++ Zend/zend_hash.c    Mon Aug 11 16:19:19 2003
@@ -29,8 +29,11 @@
 #define HANDLE_NUMERIC(key, length, func) {                                           
                                                 \
        register char *tmp=key;                                                        
                                                                 \
                                                                                       
                                                                                       
  \
+       if (*tmp=='-') {                                                               
                                                                         \
+               tmp++;                                                                 
                                                                                 \
+       }                                                                              
                                                                                       
  \
        if ((*tmp>='0' && *tmp<='9')) do { /* possibly a numeric index */              
                         \
-               char *end=tmp+length-1;                                                
                                                                 \
+               char *end=key+length-1;                                                
                                                                 \
                ulong idx;                                                             
                                                                                 \
                                                                                       
                                                                                       
  \
                if (*tmp++=='0' && length>2) { /* don't accept numbers with leading 
zeros */    \
@@ -43,12 +46,19 @@
                        tmp++;                                                         
                                                                                 \
                }                                                                      
                                                                                       
  \
                if (tmp==end && *tmp=='\0') { /* a numeric index */                    
                                         \
-                       idx = strtol(key, NULL, 10);                                   
                                                                 \
-                       if (idx!=LONG_MAX) {                                           
                                                                 \
-                               return func;                                           
                                                                         \
+                       if (*key=='-') {                                               
                                                                         \
+                               idx = strtol(key, NULL, 10);                           
                                                         \
+                               if (idx!=LONG_MIN) {                                   
                                                                 \
+                                       return func;                                   
                                                                         \
+                               }                                                      
                                                                                       
  \
+                       } else {                                                       
                                                                                 \
+                               idx = strtol(key, NULL, 10);                           
                                                         \
+                               if (idx!=LONG_MAX) {                                   
                                                                 \
+                                       return func;                                   
                                                                         \
+                               }                                                      
                                                                                       
  \
                        }                                                              
                                                                                       
  \
                }                                                                      
                                                                                       
  \
-       } while (0);                                                                   
                                                                                 \
+       } while (0);                                                                   
                                                                         \
 }
 
 
@@ -393,7 +403,7 @@
                        }
                        UPDATE_DATA(ht, p, pData, nDataSize);
                        HANDLE_UNBLOCK_INTERRUPTIONS();
-                       if ((long)h >= (long)ht->nNextFreeElement) { /* comparing 
signed to avoid wraparounds on -1 */
+                       if ((long)h >= (long)ht->nNextFreeElement || 
!ht->nNumOfElements) { /* comparing signed to avoid wraparounds on -1 */
                                ht->nNextFreeElement = h + 1;
                        }
                        if (pDest) {
@@ -421,7 +431,7 @@
        CONNECT_TO_GLOBAL_DLLIST(p, ht);
        HANDLE_UNBLOCK_INTERRUPTIONS();
 
-       if ((long)h >= (long)ht->nNextFreeElement) { /* comparing signed to avoid 
wraparounds on -1 */
+       if ((long)h >= (long)ht->nNextFreeElement || !ht->nNumOfElements) { /* 
comparing signed to avoid wraparounds on -1 */
                ht->nNextFreeElement = h + 1;
        }
        ht->nNumOfElements++;

Index: php-src/ext/standard/tests/array/bug21918.phpt
+++ php-src/ext/standard/tests/array/bug21918.phpt
--TEST--
--FILE--
<?php

echo "==Mixed==\n";
$a = array(-1=>'a', '-2'=>'b', 3=>'c', '4'=>'d', 5=>'e', '6001'=>'f', '07'=>'g');

foreach($a as $k => $v) {
        var_dump($k);
        var_dump($v);
}

echo "==Normal==\n";
$b = array();
$b[] = 'a';

foreach($b as $k => $v) {
        var_dump($k);
        var_dump($v);
}

echo "==Negative==\n";
$c = array('-2' => 'a');
$c[] = 'b';

foreach($c as $k => $v) {
        var_dump($k);
        var_dump($v);
}

echo "==Done==\n";
?>
--EXPECT--
==Mixed==
int(-1)
string(1) "a"
int(-2)
string(1) "b"
int(3)
string(1) "c"
int(4)
string(1) "d"
int(5)
string(1) "e"
int(6001)
string(1) "f"
string(2) "07"
string(1) "g"
==Normal==
int(0)
string(1) "a"
==Negative==
int(-2)
string(1) "a"
int(-1)
string(1) "b"
==Done==



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to