ext/gmp: Check for valid bit index/start consistently

This commit is contained in:
Gina Peter Banyard 2024-11-27 16:56:54 +00:00
parent 38a28993fc
commit f8547b1d97
7 changed files with 27 additions and 27 deletions

View file

@ -1524,6 +1524,10 @@ ZEND_FUNCTION(gmp_random_range)
}
/* }}} */
static bool gmp_is_bit_index_valid(zend_long index) {
return index >= 0 && (index / GMP_NUMB_BITS < INT_MAX);
}
/* {{{ Sets or clear bit in a */
ZEND_FUNCTION(gmp_setbit)
{
@ -1536,12 +1540,8 @@ ZEND_FUNCTION(gmp_setbit)
RETURN_THROWS();
}
if (index < 0) {
zend_argument_value_error(2, "must be greater than or equal to 0");
RETURN_THROWS();
}
if (index / GMP_NUMB_BITS >= INT_MAX) {
zend_argument_value_error(2, "must be less than %d * %d", INT_MAX, GMP_NUMB_BITS);
if (!gmp_is_bit_index_valid(index)) {
zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
RETURN_THROWS();
}
@ -1566,8 +1566,8 @@ ZEND_FUNCTION(gmp_clrbit)
RETURN_THROWS();
}
if (index < 0) {
zend_argument_value_error(2, "must be greater than or equal to 0");
if (!gmp_is_bit_index_valid(index)) {
zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
RETURN_THROWS();
}
@ -1587,8 +1587,8 @@ ZEND_FUNCTION(gmp_testbit)
Z_PARAM_LONG(index)
ZEND_PARSE_PARAMETERS_END();
if (index < 0) {
zend_argument_value_error(2, "must be greater than or equal to 0");
if (!gmp_is_bit_index_valid(index)) {
zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
RETURN_THROWS();
}
@ -1634,8 +1634,8 @@ ZEND_FUNCTION(gmp_scan0)
Z_PARAM_LONG(start)
ZEND_PARSE_PARAMETERS_END();
if (start < 0) {
zend_argument_value_error(2, "must be greater than or equal to 0");
if (!gmp_is_bit_index_valid(start)) {
zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
RETURN_THROWS();
}
@ -1654,8 +1654,8 @@ ZEND_FUNCTION(gmp_scan1)
Z_PARAM_LONG(start)
ZEND_PARSE_PARAMETERS_END();
if (start < 0) {
zend_argument_value_error(2, "must be greater than or equal to 0");
if (!gmp_is_bit_index_valid(start)) {
zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
RETURN_THROWS();
}

View file

@ -44,11 +44,11 @@ try {
echo "Done\n";
?>
--EXPECT--
--EXPECTF--
string(1) "0"
gmp_clrbit(): Argument #2 ($index) must be greater than or equal to 0
gmp_clrbit(): Argument #2 ($index) must be between 0 and %d * %d
string(2) "-1"
gmp_clrbit(): Argument #2 ($index) must be greater than or equal to 0
gmp_clrbit(): Argument #2 ($index) must be between 0 and %d * %d
string(7) "1000000"
string(7) "1000000"
string(30) "238462734628347239571822592658"

View file

@ -27,8 +27,8 @@ try {
echo "Done\n";
?>
--EXPECT--
gmp_scan0(): Argument #2 ($start) must be greater than or equal to 0
--EXPECTF--
gmp_scan0(): Argument #2 ($start) must be between 0 and %d * %d
int(2)
int(0)
int(5)

View file

@ -27,8 +27,8 @@ try {
echo "Done\n";
?>
--EXPECT--
gmp_scan1(): Argument #2 ($start) must be greater than or equal to 0
--EXPECTF--
gmp_scan1(): Argument #2 ($start) must be between 0 and %d * %d
int(1)
int(12)
int(9)

View file

@ -50,9 +50,9 @@ try {
echo "Done\n";
?>
--EXPECT--
--EXPECTF--
string(2) "-1"
gmp_setbit(): Argument #2 ($index) must be greater than or equal to 0
gmp_setbit(): Argument #2 ($index) must be between 0 and %d * %d
string(1) "5"
string(1) "1"
string(1) "7"

View file

@ -41,5 +41,5 @@ FFFFFFFF
3FFFFFFFF
FFFFFFFFF
3FFFFFFFFF
gmp_setbit(): Argument #2 ($index) must be less than %d * %d
gmp_setbit(): Argument #2 ($index) must be between 0 and %d * %d
Done

View file

@ -47,13 +47,13 @@ var_dump(gmp_strval($n));
echo "Done\n";
?>
--EXPECT--
gmp_testbit(): Argument #2 ($index) must be greater than or equal to 0
--EXPECTF--
gmp_testbit(): Argument #2 ($index) must be between 0 and %d * %d
bool(false)
bool(false)
bool(false)
bool(true)
gmp_testbit(): Argument #2 ($index) must be greater than or equal to 0
gmp_testbit(): Argument #2 ($index) must be between 0 and %d * %d
bool(false)
bool(true)
string(7) "1000002"