diff options
| author | Sara Golemon <pollita@php.net> | 2016-07-26 21:57:07 -0700 |
|---|---|---|
| committer | Sara Golemon <pollita@php.net> | 2016-07-26 22:04:18 -0700 |
| commit | 665050787c18a5d09f1b6d1443efbad901b9ac0b (patch) | |
| tree | 8e9125c1872bf74b53c554986a9d2f7772b256fc | |
| parent | 256d69cf8a9a67a47b92ad8e8c437b2d59d6806c (diff) | |
| download | php-git-665050787c18a5d09f1b6d1443efbad901b9ac0b.tar.gz | |
Bugfix#70896 gmp_fact() silently ignores non-integer inputs
Factorials only make sense for integer inputs.
To do something factorial-like, the Gamma Function
should be used instead.
However, at this point it's no longer a factorial.
For PHP/GMP, we'll raise a warning on trying to use
a non-integer input, but carry on returning the truncated
value as we used to (avoiding BC breakage).
| -rw-r--r-- | NEWS | 3 | ||||
| -rw-r--r-- | ext/gmp/gmp.c | 11 | ||||
| -rw-r--r-- | ext/gmp/tests/gmp_fact.phpt | 6 |
3 files changed, 19 insertions, 1 deletions
@@ -2,4 +2,7 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2016, PHP 7.2.0alpha1 +- GMP: + . Fixed bug #70896 (gmp_fact() silently ignores non-integer input). (Sara) + <<< NOTE: Insert NEWS from last stable release here prior to actual release! >>> diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index 30693da5cb..ea3c6cf408 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -1365,7 +1365,16 @@ ZEND_FUNCTION(gmp_fact) RETURN_FALSE; } } else { - if (zval_get_long(a_arg) < 0) { + /* Use convert_to_number first to detect getting non-integer */ + convert_scalar_to_number(a_arg); + if (Z_TYPE_P(a_arg) != IS_LONG) { + convert_to_long(a_arg); + if (Z_LVAL_P(a_arg) >= 0) { + /* Only warn if we'll make it past the non-negative check */ + php_error_docref(NULL, E_WARNING, "Number has to be an integer"); + } + } + if (Z_LVAL_P(a_arg) < 0) { php_error_docref(NULL, E_WARNING, "Number has to be greater than or equal to 0"); RETURN_FALSE; } diff --git a/ext/gmp/tests/gmp_fact.phpt b/ext/gmp/tests/gmp_fact.phpt index 6afccaf936..5cb8089b49 100644 --- a/ext/gmp/tests/gmp_fact.phpt +++ b/ext/gmp/tests/gmp_fact.phpt @@ -38,6 +38,8 @@ string(1) "0" Warning: gmp_fact(): Number has to be greater than or equal to 0 in %s on line %d string(1) "0" + +Warning: gmp_fact(): Number has to be an integer in %s on line %d string(1) "1" string(19) "2432902008176640000" string(65) "30414093201713378043612608166064768844377641568960512000000000000" @@ -53,9 +55,13 @@ NULL Warning: gmp_fact() expects exactly 1 parameter, 2 given in %s on line %d NULL + +Warning: gmp_fact(): Number has to be an integer in %s on line %d object(GMP)#%d (1) { ["num"]=> string(1) "1" } + +Warning: gmp_fact(): Number has to be an integer in %s on line %d string(1) "1" Done |
