]> granicus.if.org Git - php/commitdiff
Bugfix#70896 gmp_fact() silently ignores non-integer inputs
authorSara Golemon <pollita@php.net>
Wed, 27 Jul 2016 04:57:07 +0000 (21:57 -0700)
committerSara Golemon <pollita@php.net>
Wed, 27 Jul 2016 05:04:18 +0000 (22:04 -0700)
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).

NEWS
ext/gmp/gmp.c
ext/gmp/tests/gmp_fact.phpt

diff --git a/NEWS b/NEWS
index 317f73c5c8ba2859b7eea255fed3ba99dc833afb..7b1e2d4baeeddb0a8cba20e523deb3b3e044f87f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -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! >>>
index 30693da5cb519368ae63e89790a021142a74cca5..ea3c6cf408e386ac09d61ced41bea85054f0a12c 100644 (file)
@@ -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;
                }
index 6afccaf936cc01d33dee06f808d7801b4779516d..5cb8089b49e8daef275e15b239d79f76163aec1e 100644 (file)
@@ -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