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