helly Fri Mar 26 20:17:07 2004 EDT Added files: (Branch: PHP_4_3) /php-src/ext/standard/tests/math bug27646.phpt
Modified files: /php-src/ext/standard config.m4 basic_functions.c basic_functions.h var_unserializer.re Log: MFH: bugfix #27646 http://cvs.php.net/diff.php/php-src/ext/standard/config.m4?r1=1.47.2.5&r2=1.47.2.6&ty=u Index: php-src/ext/standard/config.m4 diff -u php-src/ext/standard/config.m4:1.47.2.5 php-src/ext/standard/config.m4:1.47.2.6 --- php-src/ext/standard/config.m4:1.47.2.5 Wed Aug 27 13:57:31 2003 +++ php-src/ext/standard/config.m4 Fri Mar 26 20:17:06 2004 @@ -1,4 +1,4 @@ -dnl $Id: config.m4,v 1.47.2.5 2003/08/27 17:57:31 sniper Exp $ -*- sh -*- +dnl $Id: config.m4,v 1.47.2.6 2004/03/27 01:17:06 helly Exp $ -*- sh -*- divert(3)dnl @@ -263,6 +263,71 @@ AC_DEFINE(ENABLE_CHROOT_FUNC, 1, [Whether to enable chroot() function]) fi +AC_CHECK_FUNCS(fpclass isinf isnan) + +AC_CACHE_CHECK(whether atof() accepts NAN, ac_cv_atof_accept_nan,[ + AC_TRY_RUN([ +#include <math.h> +#include <stdlib.h> + +#ifdef HAVE_ISNAN +#define zend_isnan(a) isnan(a) +#elif defined(NAN) +#define zend_isnan(a) (((a)==NAN)?1:0) +#elif defined(HAVE_FPCLASS) +#define zend_isnan(a) ((fpclass(a) == FP_SNAN) || (fpclass(a) == FP_QNAN)) +#else +#define zend_isnan(a) 0 +#endif + +int main(int argc, char** argv) +{ + return zend_isnan(atof("NAN")) ? 0 : 1; +} + ],[ + ac_cv_atof_accept_nan=yes + ],[ + ac_cv_atof_accept_nan=no + ],[ + ac_cv_atof_accept_nan=no + ]) + if test "$ac_cv_atof_accept_nan" = "yes"; then + AC_DEFINE([HAVE_ATOF_ACCEPTS_NAN], 1, [whether atof() accepts NAN]) + fi +]) + +AC_CACHE_CHECK(whether atof() accepts INF, ac_cv_atof_accept_inf,[ + AC_TRY_RUN([ +#include <math.h> +#include <stdlib.h> + +#ifdef HAVE_ISINF +#define zend_isinf(a) isinf(a) +#elif defined(INFINITY) +/* Might not work, but is required by ISO C99 */ +#define zend_isinf(a) (((a)==INFINITY)?1:0) +#elif defined(HAVE_FPCLASS) +#define zend_isinf(a) ((fpclass(a) == FP_PINF) || (fpclass(a) == FP_NINF)) +#else +#define zend_isinf(a) 0 +#endif + +int main(int argc, char** argv) +{ + return zend_isinf(atof("INF")) && zend_isinf(atof("-INF")) ? 0 : 1; +} + ],[ + ac_cv_atof_accept_inf=yes + ],[ + ac_cv_atof_accept_inf=no + ],[ + ac_cv_atof_accept_inf=no + ]) + if test "$ac_cv_atof_accept_inf" = "yes"; then + AC_DEFINE([HAVE_ATOF_ACCEPTS_INF], 1, [whether atof() accepts INF]) + fi +]) + PHP_NEW_EXTENSION(standard, array.c base64.c basic_functions.c browscap.c crc32.c crypt.c \ cyr_convert.c datetime.c dir.c dl.c dns.c exec.c file.c filestat.c \ flock_compat.c formatted_print.c fsock.c head.c html.c image.c \ http://cvs.php.net/diff.php/php-src/ext/standard/basic_functions.c?r1=1.543.2.32&r2=1.543.2.33&ty=u Index: php-src/ext/standard/basic_functions.c diff -u php-src/ext/standard/basic_functions.c:1.543.2.32 php-src/ext/standard/basic_functions.c:1.543.2.33 --- php-src/ext/standard/basic_functions.c:1.543.2.32 Fri Mar 12 12:42:09 2004 +++ php-src/ext/standard/basic_functions.c Fri Mar 26 20:17:06 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: basic_functions.c,v 1.543.2.32 2004/03/12 17:42:09 rasmus Exp $ */ +/* $Id: basic_functions.c,v 1.543.2.33 2004/03/27 01:17:06 helly Exp $ */ #include "php.h" #include "php_streams.h" @@ -996,6 +996,35 @@ } +#define PHP_DOUBLE_INFINITY_HIGH 0x7ff00000 +#define PHP_DOUBLE_QUIET_NAN_HIGH 0xfff80000 + +PHPAPI double php_get_nan() +{ +#if defined(__i386__) || defined(_X86_) || defined(ALPHA) || defined(_ALPHA) || defined(__alpha) + double val; + ((php_uint32*)&val)[1] = PHP_DOUBLE_QUIET_NAN_HIGH; + ((php_uint32*)&val)[0] = 0; + return val; +#else + /* hope the target platform is ISO-C compliant */ + return atof("NAN"); +#endif +} + +PHPAPI double php_get_inf() +{ +#if defined(__i386__) || defined(_X86_) || defined(ALPHA) || defined(_ALPHA) || defined(__alpha) + double val; + ((php_uint32*)&val)[1] = PHP_DOUBLE_INFINITY_HIGH; + ((php_uint32*)&val)[0] = 0; + return val; +#else + /* hope the target platform is ISO-C compliant */ + return atof("INF"); +#endif +} + PHP_MINIT_FUNCTION(basic) { #ifdef ZTS @@ -1027,6 +1056,8 @@ REGISTER_MATH_CONSTANT(M_2_SQRTPI); REGISTER_MATH_CONSTANT(M_SQRT2); REGISTER_MATH_CONSTANT(M_SQRT1_2); + REGISTER_DOUBLE_CONSTANT("INF", php_get_inf(), CONST_CS | CONST_PERSISTENT); + REGISTER_DOUBLE_CONSTANT("NAN", php_get_nan(), CONST_CS | CONST_PERSISTENT); #if ENABLE_TEST_CLASS test_class_startup(); http://cvs.php.net/diff.php/php-src/ext/standard/basic_functions.h?r1=1.109.2.1&r2=1.109.2.2&ty=u Index: php-src/ext/standard/basic_functions.h diff -u php-src/ext/standard/basic_functions.h:1.109.2.1 php-src/ext/standard/basic_functions.h:1.109.2.2 --- php-src/ext/standard/basic_functions.h:1.109.2.1 Tue Dec 31 11:35:25 2002 +++ php-src/ext/standard/basic_functions.h Fri Mar 26 20:17:06 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: basic_functions.h,v 1.109.2.1 2002/12/31 16:35:25 sebastian Exp $ */ +/* $Id: basic_functions.h,v 1.109.2.2 2004/03/27 01:17:06 helly Exp $ */ #ifndef BASIC_FUNCTIONS_H #define BASIC_FUNCTIONS_H @@ -211,4 +211,7 @@ #define SAFE_MODE_PROTECTED_ENV_VARS "LD_LIBRARY_PATH" #define SAFE_MODE_ALLOWED_ENV_VARS "PHP_" +PHPAPI double php_get_nan(); +PHPAPI double php_get_inf(); + #endif /* BASIC_FUNCTIONS_H */ http://cvs.php.net/diff.php/php-src/ext/standard/var_unserializer.re?r1=1.11.4.2&r2=1.11.4.3&ty=u Index: php-src/ext/standard/var_unserializer.re diff -u php-src/ext/standard/var_unserializer.re:1.11.4.2 php-src/ext/standard/var_unserializer.re:1.11.4.3 --- php-src/ext/standard/var_unserializer.re:1.11.4.2 Wed Sep 3 12:26:42 2003 +++ php-src/ext/standard/var_unserializer.re Fri Mar 26 20:17:06 2004 @@ -1,3 +1,4 @@ + #include "php.h" #include "ext/standard/php_var.h" #include "php_incomplete_class.h" @@ -275,6 +276,23 @@ return 1; } +"d:" ("NAN" | "-"? "INF") ";" { + *p = YYCURSOR; + INIT_PZVAL(*rval); +#if defined(HAVE_ATOF_ACCEPTS_NAN) && defined(HAVE_ATOF_ACCEPTS_INF) + ZVAL_DOUBLE(*rval, atof(start + 2)); +#else + if (!strncmp(start + 2, "NAN", 3)) { + ZVAL_DOUBLE(*rval, php_get_nan()); + } else if (!strncmp(start + 2, "INF", 3)) { + ZVAL_DOUBLE(*rval, php_get_inf()); + } else if (!strncmp(start + 2, "-INF", 4)) { + ZVAL_DOUBLE(*rval, -php_get_inf()); + } +#endif + return 1; +} + "d:" (iv | nv | nvexp) ";" { *p = YYCURSOR; INIT_PZVAL(*rval); http://cvs.php.net/co.php/php-src/ext/standard/tests/math/bug27646.phpt?r=1.1&p=1 Index: php-src/ext/standard/tests/math/bug27646.phpt +++ php-src/ext/standard/tests/math/bug27646.phpt --TEST-- Bug #27646 (Cannot serialize/unserialize non-finite numeric values) --FILE-- <?php $f=-(float)INF; var_dump($f); var_dump(serialize($f)); var_dump(unserialize(serialize($f))); $f=(float)INF; var_dump($f); var_dump(serialize($f)); var_dump(unserialize(serialize($f))); $f=(float)NAN; var_dump($f); var_dump(serialize($f)); var_dump(unserialize(serialize($f))); ?> --EXPECT-- float(-INF) string(7) "d:-INF;" float(-INF) float(INF) string(6) "d:INF;" float(INF) float(NAN) string(6) "d:NAN;" float(NAN) -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php