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
