diff options
author | Dmitry Stogov <dmitry@php.net> | 2007-12-17 10:02:13 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2007-12-17 10:02:13 +0000 |
commit | 2b981769a3c030fb9feddb3cc8d888efe9d2c2e7 (patch) | |
tree | e170f703fe7929b108dd8c6b3fcc28d2ab67829e /Zend/zend_operators.c | |
parent | 31a779e8137685a848987d52e1da8c8f46207a15 (diff) | |
download | php-git-2b981769a3c030fb9feddb3cc8d888efe9d2c2e7.tar.gz |
Fixed bug #42868 (Floats cast to integer produce unpredicatable results). (Zoe Slattery)
Diffstat (limited to 'Zend/zend_operators.c')
-rw-r--r-- | Zend/zend_operators.c | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 0805ec7167..c177c3ec8f 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -183,20 +183,37 @@ ZEND_API void convert_scalar_to_number(zval *op TSRMLS_DC) } \ } +#define MAX_UNSIGNED_INT ((double) LONG_MAX * 2) + 1 #ifdef _WIN64 # define DVAL_TO_LVAL(d, l) \ - if ((d) > LONG_MAX) { \ - (l) = (long)(unsigned long)(__int64) (d); \ - } else { \ - (l) = (long) (d); \ - } + if ((d) > LONG_MAX) { \ + if ((d) > MAX_UNSIGNED_INT) { \ + (l) = LONG_MAX; \ + } else { \ + (l) = (long)(unsigned long)(__int64) (d); \ + } \ + } else { \ + if((d) < LONG_MIN) { \ + (l) = LONG_MIN; \ + } else { \ + (l) = (long) (d); \ + } \ + } #else # define DVAL_TO_LVAL(d, l) \ - if ((d) > LONG_MAX) { \ - (l) = (unsigned long) (d); \ - } else { \ - (l) = (long) (d); \ - } + if ((d) > LONG_MAX) { \ + if ((d) > MAX_UNSIGNED_INT) { \ + (l) = LONG_MAX; \ + } else { \ + (l) = (unsigned long) (d); \ + } \ + } else { \ + if((d) < LONG_MIN) { \ + (l) = LONG_MIN; \ + } else { \ + (l) = (long) (d); \ + } \ + } #endif #define zendi_convert_to_long(op, holder, result) \ |