summaryrefslogtreecommitdiff
path: root/Zend/zend_API.h
diff options
context:
space:
mode:
authorAndrea Faulds <ajf@ajf.me>2014-09-22 17:06:16 +0100
committerAndrea Faulds <ajf@ajf.me>2014-09-22 17:06:16 +0100
commitbb55397babf7f0f9b553667669b8326094408481 (patch)
tree24424d74880b1f103702646aa6800210d51ec783 /Zend/zend_API.h
parent0c0d43bd4ee71f831c51ba2077869e8ab0345198 (diff)
downloadphp-git-bb55397babf7f0f9b553667669b8326094408481.tar.gz
Make zpp fail if NaN passed for int, or out-of-range float for non-capping int
Diffstat (limited to 'Zend/zend_API.h')
-rw-r--r--Zend/zend_API.h27
1 files changed, 19 insertions, 8 deletions
diff --git a/Zend/zend_API.h b/Zend/zend_API.h
index 657d1d04de..97a069b463 100644
--- a/Zend/zend_API.h
+++ b/Zend/zend_API.h
@@ -1081,10 +1081,16 @@ static zend_always_inline int _z_param_long(zval *arg, zend_long *dest, zend_boo
if (EXPECTED(Z_TYPE_P(arg) == IS_LONG)) {
*dest = Z_LVAL_P(arg);
} else if (EXPECTED(Z_TYPE_P(arg) == IS_DOUBLE)) {
- if (strict && UNEXPECTED(Z_DVAL_P(arg) > ZEND_LONG_MAX)) {
- *dest = ZEND_LONG_MAX;
- } else if (strict && UNEXPECTED(Z_DVAL_P(arg) < ZEND_LONG_MIN)) {
- *dest = ZEND_LONG_MIN;
+ if (UNEXPECTED(zend_isnan(Z_DVAL_P(arg)))) {
+ return 0;
+ }
+ if (UNEXPECTED(Z_DVAL_P(arg) > ZEND_LONG_MAX || Z_DVAL_P(arg) < ZEND_LONG_MIN)) {
+ /* Ironically, the strict parameter makes zpp *non*-strict here */
+ if (strict) {
+ *dest = (Z_DVAL_P(arg) > 0) ? ZEND_LONG_MAX : ZEND_LONG_MIN;
+ } else {
+ return 0;
+ }
} else {
*dest = zend_dval_to_lval(Z_DVAL_P(arg));
}
@@ -1094,10 +1100,15 @@ static zend_always_inline int _z_param_long(zval *arg, zend_long *dest, zend_boo
if (UNEXPECTED((type = is_numeric_str_function(Z_STR_P(arg), dest, &d)) != IS_LONG)) {
if (EXPECTED(type != 0)) {
- if (strict && UNEXPECTED(d > ZEND_LONG_MAX)) {
- *dest = ZEND_LONG_MAX;
- } else if (strict && UNEXPECTED(d < ZEND_LONG_MIN)) {
- *dest = ZEND_LONG_MIN;
+ if (UNEXPECTED(zend_isnan(Z_DVAL_P(arg)))) {
+ return 0;
+ }
+ if (UNEXPECTED(d > ZEND_LONG_MAX || d < ZEND_LONG_MIN)) {
+ if (strict) {
+ *dest = (d > 0) ? ZEND_LONG_MAX : ZEND_LONG_MIN;
+ } else {
+ return 0;
+ }
} else {
*dest = zend_dval_to_lval(d);
}