]> granicus.if.org Git - php/commitdiff
MFH:
authorFelipe Pena <felipe@php.net>
Tue, 6 Jan 2009 01:29:22 +0000 (01:29 +0000)
committerFelipe Pena <felipe@php.net>
Tue, 6 Jan 2009 01:29:22 +0000 (01:29 +0000)
- Fixed bug #46701 (Creating associative array with long values in the key fails on 32bit linux)
Patch by Shire

Zend/tests/bug46701.phpt [new file with mode: 0644]
Zend/zend_execute.c
Zend/zend_operators.c
Zend/zend_operators.h
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/Zend/tests/bug46701.phpt b/Zend/tests/bug46701.phpt
new file mode 100644 (file)
index 0000000..d76b810
--- /dev/null
@@ -0,0 +1,42 @@
+--TEST--
+Bug #46701 (Creating associative array with long values in the key fails on 32bit linux)
+--SKIPIF--
+<?php if (PHP_INT_MAX != 4) die('skip this test is for 32bit platforms only'); ?>
+--FILE--
+<?php
+
+$test_array = array(
+       0xcc5c4600 => 1,
+       0xce331a00 => 2
+);
+$test_array[0xce359000] = 3;
+  
+var_dump($test_array);
+var_dump($test_array[0xce331a00]);
+
+class foo {
+       public $x;
+       
+       public function __construct() {
+               $this->x[0xce359000] = 3;
+               var_dump($this->x);
+       }
+}
+
+new foo;
+
+?>
+--EXPECT--
+array(3) {
+  [-866368000]=>
+  int(1)
+  [-835511808]=>
+  int(2)
+  [-835350528]=>
+  int(3)
+}
+int(2)
+array(1) {
+  [-835350528]=>
+  int(3)
+}
index 3dc4ab225370d80229779b8f6f7a19331973474a..7d8fb56cedea8499146f4882c6497325340804f3 100644 (file)
@@ -979,7 +979,7 @@ fetch_string_dim:
                                long index;
 
                                if (Z_TYPE_P(dim) == IS_DOUBLE) {
-                                       index = (long)Z_DVAL_P(dim);
+                                       DVAL_TO_LVAL(Z_DVAL_P(dim), index);
                                } else {
                                        index = Z_LVAL_P(dim);
                                }
index 0d3e846fdf83cb2f22430511504846f61fb3cf3c..6cef79691eec5fa496cd51ee3f1f676abb873a17 100644 (file)
@@ -186,22 +186,6 @@ ZEND_API void convert_scalar_to_number(zval *op TSRMLS_DC)
                }                                                                                                                                       \
        }
 
-#ifdef _WIN64
-# define DVAL_TO_LVAL(d, l) \
-       if ((d) > LONG_MAX) { \
-               (l) = (long)(unsigned long)(__int64) (d); \
-       } else { \
-               (l) = (long) (d); \
-       }
-#else
-# define DVAL_TO_LVAL(d, l) \
-       if ((d) > LONG_MAX) { \
-               (l) = (unsigned long) (d); \
-       } else { \
-               (l) = (long) (d); \
-       }
-#endif
-
 #define zendi_convert_to_long(op, holder, result)                                      \
        if (op == result) {                                                                                             \
                convert_to_long(op);                                                                            \
index 1968cb06d51f96269a8507e26c95a55c21b957e1..0415542fe5b6a9e9aacc4667b7c1ea9db7bb48d4 100644 (file)
@@ -75,6 +75,22 @@ ZEND_API zend_bool instanceof_function_ex(zend_class_entry *instance_ce, zend_cl
 ZEND_API zend_bool instanceof_function(zend_class_entry *instance_ce, zend_class_entry *ce TSRMLS_DC);
 END_EXTERN_C()
 
+#ifdef _WIN64
+# define DVAL_TO_LVAL(d, l) \
+      if ((d) > LONG_MAX) { \
+              (l) = (long)(unsigned long)(__int64) (d); \
+      } else { \
+              (l) = (long) (d); \
+      }
+#else
+# define DVAL_TO_LVAL(d, l) \
+      if ((d) > LONG_MAX) { \
+              (l) = (unsigned long) (d); \
+      } else { \
+              (l) = (long) (d); \
+      }
+#endif
+
 #define ZEND_IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
 #define ZEND_IS_XDIGIT(c) (((c) >= 'A' && (c) <= 'F') || ((c) >= 'a'  && (c) <= 'f'))
 
index c98eca1e590dfc8c47b873f2b2d6261ccccc1bc3..809227230a9fd1b0bd38e6bd70b24e257fec488d 100644 (file)
@@ -2723,9 +2723,11 @@ ZEND_VM_HANDLER(72, ZEND_ADD_ARRAY_ELEMENT, CONST|TMP|VAR|CV, CONST|TMP|VAR|UNUS
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
index 89fd872d15548497560bbfdb748cbd68db66745f..3bf275e0ed7e284487321165e3ad1ee01708cfbc 100644 (file)
@@ -2810,9 +2810,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -3169,9 +3171,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -3528,9 +3532,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -3621,9 +3627,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -3979,9 +3987,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -5440,9 +5450,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARG
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -5885,9 +5897,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -6330,9 +6344,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -6423,9 +6439,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_AR
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -6865,9 +6883,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -9512,9 +9532,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARG
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -11032,9 +11054,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -12600,9 +12624,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -13309,9 +13335,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_AR
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -14609,9 +14637,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -21656,9 +21686,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -23168,9 +23200,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -24727,9 +24761,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -25431,9 +25467,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARG
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL:
@@ -26726,9 +26764,11 @@ static int ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                }
        }
        if (offset) {
+               long l;
                switch (Z_TYPE_P(offset)) {
                        case IS_DOUBLE:
-                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), (long) Z_DVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
+                               DVAL_TO_LVAL(Z_DVAL_P(offset), l);
+                               zend_hash_index_update(Z_ARRVAL_P(array_ptr), l, &expr_ptr, sizeof(zval *), NULL);
                                break;
                        case IS_LONG:
                        case IS_BOOL: