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 */ /* {{{ Sets or clear bit in a */
ZEND_FUNCTION(gmp_setbit) ZEND_FUNCTION(gmp_setbit)
{ {
@ -1536,12 +1540,8 @@ ZEND_FUNCTION(gmp_setbit)
RETURN_THROWS(); RETURN_THROWS();
} }
if (index < 0) { if (!gmp_is_bit_index_valid(index)) {
zend_argument_value_error(2, "must be greater than or equal to 0"); zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
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);
RETURN_THROWS(); RETURN_THROWS();
} }
@ -1566,8 +1566,8 @@ ZEND_FUNCTION(gmp_clrbit)
RETURN_THROWS(); RETURN_THROWS();
} }
if (index < 0) { if (!gmp_is_bit_index_valid(index)) {
zend_argument_value_error(2, "must be greater than or equal to 0"); zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
RETURN_THROWS(); RETURN_THROWS();
} }
@ -1587,8 +1587,8 @@ ZEND_FUNCTION(gmp_testbit)
Z_PARAM_LONG(index) Z_PARAM_LONG(index)
ZEND_PARSE_PARAMETERS_END(); ZEND_PARSE_PARAMETERS_END();
if (index < 0) { if (!gmp_is_bit_index_valid(index)) {
zend_argument_value_error(2, "must be greater than or equal to 0"); zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
RETURN_THROWS(); RETURN_THROWS();
} }
@ -1634,8 +1634,8 @@ ZEND_FUNCTION(gmp_scan0)
Z_PARAM_LONG(start) Z_PARAM_LONG(start)
ZEND_PARSE_PARAMETERS_END(); ZEND_PARSE_PARAMETERS_END();
if (start < 0) { if (!gmp_is_bit_index_valid(start)) {
zend_argument_value_error(2, "must be greater than or equal to 0"); zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
RETURN_THROWS(); RETURN_THROWS();
} }
@ -1654,8 +1654,8 @@ ZEND_FUNCTION(gmp_scan1)
Z_PARAM_LONG(start) Z_PARAM_LONG(start)
ZEND_PARSE_PARAMETERS_END(); ZEND_PARSE_PARAMETERS_END();
if (start < 0) { if (!gmp_is_bit_index_valid(start)) {
zend_argument_value_error(2, "must be greater than or equal to 0"); zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
RETURN_THROWS(); RETURN_THROWS();
} }

View file

@ -44,11 +44,11 @@ try {
echo "Done\n"; echo "Done\n";
?> ?>
--EXPECT-- --EXPECTF--
string(1) "0" 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" 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(7) "1000000" string(7) "1000000"
string(30) "238462734628347239571822592658" string(30) "238462734628347239571822592658"

View file

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

View file

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

View file

@ -50,9 +50,9 @@ try {
echo "Done\n"; echo "Done\n";
?> ?>
--EXPECT-- --EXPECTF--
string(2) "-1" 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) "5"
string(1) "1" string(1) "1"
string(1) "7" string(1) "7"

View file

@ -41,5 +41,5 @@ FFFFFFFF
3FFFFFFFF 3FFFFFFFF
FFFFFFFFF FFFFFFFFF
3FFFFFFFFF 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 Done

View file

@ -47,13 +47,13 @@ var_dump(gmp_strval($n));
echo "Done\n"; echo "Done\n";
?> ?>
--EXPECT-- --EXPECTF--
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(false)
bool(false) bool(false)
bool(false) bool(false)
bool(true) 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(false)
bool(true) bool(true)
string(7) "1000002" string(7) "1000002"