cvs: ZendEngine2(PHP_5_3) / zend_hash.h

[email protected] ("Dmitry Stogov") Tue, 24 Mar 2009 16:02:50 -0000
Newsgroups php.zend-engine.cvs
Message-ID <cvsdmitry1237910570@cvsserver>
dmitry		Tue Mar 24 16:02:50 2009 UTC

  Modified files:              (Branch: PHP_5_3)
    /ZendEngine2	zend_hash.h 
  Log:
  Fixed "-0" parsing and optimized overflow check (Matt)
  
  
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_hash.h?r1=1.78.2.2.2.2.2.11&r2=1.78.2.2.2.2.2.12&diff_format=u
Index: ZendEngine2/zend_hash.h
diff -u ZendEngine2/zend_hash.h:1.78.2.2.2.2.2.11 ZendEngine2/zend_hash.h:1.78.2.2.2.2.2.12
--- ZendEngine2/zend_hash.h:1.78.2.2.2.2.2.11	Thu Mar 19 15:16:10 2009
+++ ZendEngine2/zend_hash.h	Tue Mar 24 16:02:50 2009
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_hash.h,v 1.78.2.2.2.2.2.11 2009/03/19 15:16:10 dmitry Exp $ */
+/* $Id: zend_hash.h,v 1.78.2.2.2.2.2.12 2009/03/24 16:02:50 dmitry Exp $ */
 
 #ifndef ZEND_HASH_H
 #define ZEND_HASH_H
@@ -314,47 +314,29 @@
 		const char *end = key + length - 1;									\
 		long idx;															\
 																			\
-		if (*end != '\0') { /* not a null terminated string */				\
+		if ((*end != '\0') /* not a null terminated string */				\
+		 || (*tmp == '0' && length > 2) /* numbers with leading zeros */	\
+		 || (end - tmp > MAX_LENGTH_OF_LONG - 1) /* number too long */		\
+		 || (SIZEOF_LONG == 4 &&											\
+		     end - tmp == MAX_LENGTH_OF_LONG - 1 &&							\
+		     *tmp > '2')) { /* overflow */									\
 			break;															\
-		} else if (*tmp == '0') {											\
-			if (end - tmp != 1) {											\
-				/* don't accept numbers with leading zeros */				\
-				break;														\
-			}																\
-			idx = 0;														\
-		} else if (end - tmp > MAX_LENGTH_OF_LONG - 1) {					\
-			/* don't accept too long strings */								\
-			break;															\
-		} else {															\
-			if (end - tmp == MAX_LENGTH_OF_LONG - 1) {						\
-				end--; /* check overflow in last digit later */				\
-			}																\
-			idx = (*tmp++ - '0');											\
-			while (tmp != end && *tmp >= '0' && *tmp <= '9') {				\
-				idx = (idx * 10) + (*tmp++ - '0');							\
-			}																\
-			if (tmp != end) {												\
-				break;														\
-			}																\
-			if (end != key + length - 1) {									\
-				/* last digit can cause overflow */							\
-				if (*tmp < '0' || *tmp > '9' || idx > LONG_MAX / 10) {		\
-					break;													\
-				}															\
-				idx = (idx * 10) + (*tmp - '0');							\
-				if (*key == '-') {											\
-					idx = -idx;												\
-					if (idx > 0) { /* overflow */							\
-						break;												\
-					}														\
-				} else if (idx < 0) { /* overflow */						\
+		}																	\
+		idx = (*tmp - '0');													\
+		while (++tmp != end && *tmp >= '0' && *tmp <= '9') {				\
+			idx = (idx * 10) + (*tmp - '0');								\
+		}																	\
+		if (tmp == end) {													\
+			if (*key == '-') {												\
+				idx = -idx;													\
+				if (idx > 0) { /* overflow */								\
 					break;													\
 				}															\
-			} else if (*key == '-') {										\
-				idx = -idx;													\
+			} else if (idx < 0) { /* overflow */							\
+				break;														\
 			}																\
+			return func;													\
 		}																	\
-		return func;														\
 	}																		\
 } while (0)