Commit:    78ff9ebb6bb501dff995727512c38fdeff50021b
Author:    Gustavo André dos Santos Lopes <cataphr...@php.net>         Tue, 22 
May 2012 12:36:28 +0200
Committer: Stanislav Malyshev <s...@php.net>      Wed, 23 May 2012 19:00:27 
-0500
Parents:   9ab21b15af2992ce4530623dcbe971e6f1ed3a95
Branches:  PHP-5.4.4

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=78ff9ebb6bb501dff995727512c38fdeff50021b

Log:
Fixed bug #62097

This fixes the fix for bug #54547 in 32-bit machines by accepting
float comparisons in 32-bit machines as long as the integer is
not larger than the mantissa.

Bugs:
https://bugs.php.net/62097
https://bugs.php.net/54547

Changed paths:
  A  Zend/tests/bug62097.phpt
  M  Zend/zend_operators.c


Diff:
diff --git a/Zend/tests/bug62097.phpt b/Zend/tests/bug62097.phpt
new file mode 100644
index 0000000..bee72e7
--- /dev/null
+++ b/Zend/tests/bug62097.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Bug #62097: fix for bug #54547 is wrong for 32-bit machines
+--SKIPIF--
+<php
+if (PHP_INT_MAX !== 2147483647)
+       die('skip for system with 32-bit wide longs only');
+--FILE--
+<?php
+var_dump("02147483647" == "2147483647",
+                "02147483648" == "2147483648",
+                "09007199254740991" == "9007199254740991",
+                "09007199254740992" == "9007199254740992");
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(false)
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index 8d4baa6..dd3ee2d 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -2041,7 +2041,13 @@ ZEND_API void zendi_smart_strcmp(zval *result, zval *s1, 
zval *s2) /* {{{ */
 
        if ((ret1=is_numeric_string_ex(Z_STRVAL_P(s1), Z_STRLEN_P(s1), &lval1, 
&dval1, 0, &oflow1)) &&
                (ret2=is_numeric_string_ex(Z_STRVAL_P(s2), Z_STRLEN_P(s2), 
&lval2, &dval2, 0, &oflow2))) {
+#if ULONG_MAX == 0xFFFFFFFF
+               if (oflow1 != 0 && oflow1 == oflow2 && dval1 - dval2 == 0. &&
+                       ((oflow1 == 1 && dval1 > 9007199254740991. 
/*0x1FFFFFFFFFFFFF*/)
+                       || (oflow1 == -1 && dval1 < -9007199254740991.))) {
+#else
                if (oflow1 != 0 && oflow1 == oflow2 && dval1 - dval2 == 0.) {
+#endif
                        /* both values are integers overflown to the same side, 
and the
                         * double comparison may have resulted in crucial 
accuracy lost */
                        goto string_cmp;


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

Reply via email to