cvs: ZendEngine2 / zend.h zend_hash.h zend_operators.h /tests bug45877.phpt

[email protected] ("Matt Wilmas") Wed, 18 Mar 2009 01:06:30 -0000
Newsgroups php.zend-engine.cvs
Message-ID <cvsmattwil1237338390@cvsserver>
mattwil		Wed Mar 18 01:06:30 2009 UTC

  Added files:                 
    /ZendEngine2/tests	bug45877.phpt 

  Modified files:              
    /ZendEngine2	zend.h zend_hash.h zend_operators.h 
  Log:
  Fixed bug #45877 (Array key '2147483647' left as string)
  
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend.h?r1=1.365&r2=1.366&diff_format=u
Index: ZendEngine2/zend.h
diff -u ZendEngine2/zend.h:1.365 ZendEngine2/zend.h:1.366
--- ZendEngine2/zend.h:1.365	Wed Feb 18 10:55:23 2009
+++ ZendEngine2/zend.h	Wed Mar 18 01:06:30 2009
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend.h,v 1.365 2009/02/18 10:55:23 dmitry Exp $ */
+/* $Id: zend.h,v 1.366 2009/03/18 01:06:30 mattwil Exp $ */
 
 #ifndef ZEND_H
 #define ZEND_H
@@ -271,6 +271,18 @@
 #define LONG_MIN (- LONG_MAX - 1)
 #endif
 
+#if SIZEOF_LONG == 4
+#define MAX_LENGTH_OF_LONG 11
+static const char long_min_digits[] = "2147483648";
+#elif SIZEOF_LONG == 8
+#define MAX_LENGTH_OF_LONG 20
+static const char long_min_digits[] = "9223372036854775808";
+#else
+#error "Unknown SIZEOF_LONG"
+#endif
+
+#define MAX_LENGTH_OF_DOUBLE 32
+
 #ifdef __GNUC__
 #	define ZSTR(x)    ((zstr)((void*)(x)))
 #	define NULL_ZSTR  ZSTR((void*)NULL)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_hash.h?r1=1.98&r2=1.99&diff_format=u
Index: ZendEngine2/zend_hash.h
diff -u ZendEngine2/zend_hash.h:1.98 ZendEngine2/zend_hash.h:1.99
--- ZendEngine2/zend_hash.h:1.98	Wed Dec 31 11:12:29 2008
+++ ZendEngine2/zend_hash.h	Wed Mar 18 01:06:30 2009
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_hash.h,v 1.98 2008/12/31 11:12:29 sebastian Exp $ */
+/* $Id: zend_hash.h,v 1.99 2009/03/18 01:06:30 mattwil Exp $ */
 
 #ifndef ZEND_HASH_H
 #define ZEND_HASH_H
@@ -406,9 +406,10 @@
 	}																					\
 	if ((*tmp>='0' && *tmp<='9')) do { /* possibly a numeric index */					\
 		const char *end=key+length-1;													\
-		long idx;																		\
+		long idx = end - tmp; /* temp var for remaining length (number of digits) */	\
 																						\
-		if (*tmp++=='0' && length>2) { /* don't accept numbers with leading zeros */	\
+		if (idx > MAX_LENGTH_OF_LONG - 1 || (*tmp++ == '0' && length > 2)) {			\
+			/* don't accept numbers too long or with leading zeros */					\
 			break;																		\
 		}																				\
 		while (tmp<end) {																\
@@ -418,17 +419,16 @@
 			tmp++;																		\
 		}																				\
 		if (tmp==end && *tmp=='\0') { /* a numeric index */								\
-			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;														\
+			if (idx == MAX_LENGTH_OF_LONG - 1) {										\
+				int cmp = strcmp(end - (MAX_LENGTH_OF_LONG - 1), long_min_digits);		\
+																						\
+				if (!(cmp < 0 || (cmp == 0 && *key == '-'))) {							\
+					break;																\
 				}																		\
 			}																			\
+																						\
+			idx = strtol(key, NULL, 10);												\
+			return func;																\
 		}																				\
 	} while (0);																		\
 }
@@ -441,9 +441,10 @@
 	}																					\
 	if ((*tmp>=0x30 /*'0'*/ && *tmp<=0x39 /*'9'*/)) do { /* possibly a numeric index */	\
 		UChar *end=key+length-1;														\
-		long idx;																		\
+		long idx = end - tmp; /* temp var for remaining length (number of digits) */	\
 																						\
-		if (*tmp++==0x30 && length>2) { /* don't accept numbers with leading zeros */	\
+		if (idx > MAX_LENGTH_OF_LONG - 1 || (*tmp++ == 0x30 && length > 2)) {			\
+			/* don't accept numbers too long or with leading zeros */								\
 			break;																		\
 		}																				\
 		while (tmp<end) {																\
@@ -453,17 +454,16 @@
 			tmp++;																		\
 		}																				\
 		if (tmp==end && *tmp==0) { /* a numeric index */								\
-			if (*key==0x2D /*'-'*/) {													\
-				idx = zend_u_strtol(key, NULL, 10);										\
-				if (idx!=LONG_MIN) {													\
-					return func;														\
-				}																		\
-			} else {																	\
-				idx = zend_u_strtol(key, NULL, 10);										\
-				if (idx!=LONG_MAX) {													\
-					return func;														\
+			if (idx == MAX_LENGTH_OF_LONG - 1) {										\
+				int cmp = zend_cmp_unicode_and_literal(end - (MAX_LENGTH_OF_LONG - 1), idx, long_min_digits, idx);	\
+																						\
+				if (!(cmp < 0 || (cmp == 0 && *key == 0x2D /*'-'*/))) {					\
+					break;																\
 				}																		\
 			}																			\
+																						\
+			idx = zend_u_strtol(key, NULL, 10);											\
+			return func;																\
 		}																				\
 	} while (0);																		\
 }
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_operators.h?r1=1.135&r2=1.136&diff_format=u
Index: ZendEngine2/zend_operators.h
diff -u ZendEngine2/zend_operators.h:1.135 ZendEngine2/zend_operators.h:1.136
--- ZendEngine2/zend_operators.h:1.135	Mon Jan  5 19:47:12 2009
+++ ZendEngine2/zend_operators.h	Wed Mar 18 01:06:30 2009
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_operators.h,v 1.135 2009/01/05 19:47:12 felipe Exp $ */
+/* $Id: zend_operators.h,v 1.136 2009/03/18 01:06:30 mattwil Exp $ */
 
 #ifndef ZEND_OPERATORS_H
 #define ZEND_OPERATORS_H
@@ -36,18 +36,6 @@
 #include "ext/bcmath/libbcmath/src/bcmath.h"
 #endif
 
-#if SIZEOF_LONG == 4
-#define MAX_LENGTH_OF_LONG 11
-static const char long_min_digits[] = "2147483648";
-#elif SIZEOF_LONG == 8
-#define MAX_LENGTH_OF_LONG 20
-static const char long_min_digits[] = "9223372036854775808";
-#else
-#error "Unknown SIZEOF_LONG"
-#endif
-
-#define MAX_LENGTH_OF_DOUBLE 32
-
 BEGIN_EXTERN_C()
 ZEND_API int add_function(zval *result, zval *op1, zval *op2 TSRMLS_DC);
 ZEND_API int sub_function(zval *result, zval *op1, zval *op2 TSRMLS_DC);

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug45877.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/bug45877.phpt
+++ ZendEngine2/tests/bug45877.phpt
--TEST--
Bug #45877 (Array key '2147483647' left as string)
--FILE--
<?php
$keys = array(PHP_INT_MAX,
	(string) PHP_INT_MAX,
	(string) (-PHP_INT_MAX - 1),
	-PHP_INT_MAX - 1,
	(string) (PHP_INT_MAX + 1));

var_dump(array_fill_keys($keys, 1));
?>
--EXPECTF--
array(3) {
  [%d7]=>
  int(1)
  [-%d8]=>
  int(1)
  [u"%d8"]=>
  int(1)
}