Skip to content

Commit 1956835

Browse files
committed
ext/gmp: gmp_fact() reject values larger than unsigned long.
1 parent 8b34389 commit 1956835

2 files changed

Lines changed: 29 additions & 2 deletions

File tree

ext/gmp/gmp.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,8 +1092,10 @@ ZEND_FUNCTION(gmp_fact)
10921092
RETURN_THROWS();
10931093
}
10941094

1095-
// TODO: Check that we don't an int that is larger than an unsigned long?
1096-
// Could use mpz_fits_slong_p() if we revert to using mpz_get_si()
1095+
if (!mpz_fits_ulong_p(gmpnum)) {
1096+
zend_argument_value_error(1, "must be between 0 and %lu", ULONG_MAX);
1097+
RETURN_THROWS();
1098+
}
10971099

10981100
INIT_GMP_RETVAL(gmpnum_result);
10991101
mpz_fac_ui(gmpnum_result, mpz_get_ui(gmpnum));
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
--TEST--
2+
gmp_fact() rejects values larger than unsigned long
3+
--EXTENSIONS--
4+
gmp
5+
--FILE--
6+
<?php
7+
8+
try {
9+
var_dump(gmp_fact(gmp_pow(2, 100)));
10+
} catch (\ValueError $e) {
11+
echo $e->getMessage() . \PHP_EOL;
12+
}
13+
14+
try {
15+
var_dump(gmp_fact(gmp_init("18446744073709551616")));
16+
} catch (\ValueError $e) {
17+
echo $e->getMessage() . \PHP_EOL;
18+
}
19+
20+
echo "Done\n";
21+
?>
22+
--EXPECTF--
23+
gmp_fact(): Argument #1 ($num) must be between 0 and %d
24+
gmp_fact(): Argument #1 ($num) must be between 0 and %d
25+
Done

0 commit comments

Comments
 (0)