Skip to content

Commit f8547b1

Browse files
committed
ext/gmp: Check for valid bit index/start consistently
1 parent 38a2899 commit f8547b1

File tree

7 files changed

+27
-27
lines changed

7 files changed

+27
-27
lines changed

ext/gmp/gmp.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1524,6 +1524,10 @@ ZEND_FUNCTION(gmp_random_range)
15241524
}
15251525
/* }}} */
15261526

1527+
static bool gmp_is_bit_index_valid(zend_long index) {
1528+
return index >= 0 && (index / GMP_NUMB_BITS < INT_MAX);
1529+
}
1530+
15271531
/* {{{ Sets or clear bit in a */
15281532
ZEND_FUNCTION(gmp_setbit)
15291533
{
@@ -1536,12 +1540,8 @@ ZEND_FUNCTION(gmp_setbit)
15361540
RETURN_THROWS();
15371541
}
15381542

1539-
if (index < 0) {
1540-
zend_argument_value_error(2, "must be greater than or equal to 0");
1541-
RETURN_THROWS();
1542-
}
1543-
if (index / GMP_NUMB_BITS >= INT_MAX) {
1544-
zend_argument_value_error(2, "must be less than %d * %d", INT_MAX, GMP_NUMB_BITS);
1543+
if (!gmp_is_bit_index_valid(index)) {
1544+
zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
15451545
RETURN_THROWS();
15461546
}
15471547

@@ -1566,8 +1566,8 @@ ZEND_FUNCTION(gmp_clrbit)
15661566
RETURN_THROWS();
15671567
}
15681568

1569-
if (index < 0) {
1570-
zend_argument_value_error(2, "must be greater than or equal to 0");
1569+
if (!gmp_is_bit_index_valid(index)) {
1570+
zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
15711571
RETURN_THROWS();
15721572
}
15731573

@@ -1587,8 +1587,8 @@ ZEND_FUNCTION(gmp_testbit)
15871587
Z_PARAM_LONG(index)
15881588
ZEND_PARSE_PARAMETERS_END();
15891589

1590-
if (index < 0) {
1591-
zend_argument_value_error(2, "must be greater than or equal to 0");
1590+
if (!gmp_is_bit_index_valid(index)) {
1591+
zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
15921592
RETURN_THROWS();
15931593
}
15941594

@@ -1634,8 +1634,8 @@ ZEND_FUNCTION(gmp_scan0)
16341634
Z_PARAM_LONG(start)
16351635
ZEND_PARSE_PARAMETERS_END();
16361636

1637-
if (start < 0) {
1638-
zend_argument_value_error(2, "must be greater than or equal to 0");
1637+
if (!gmp_is_bit_index_valid(start)) {
1638+
zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
16391639
RETURN_THROWS();
16401640
}
16411641

@@ -1654,8 +1654,8 @@ ZEND_FUNCTION(gmp_scan1)
16541654
Z_PARAM_LONG(start)
16551655
ZEND_PARSE_PARAMETERS_END();
16561656

1657-
if (start < 0) {
1658-
zend_argument_value_error(2, "must be greater than or equal to 0");
1657+
if (!gmp_is_bit_index_valid(start)) {
1658+
zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
16591659
RETURN_THROWS();
16601660
}
16611661

ext/gmp/tests/gmp_clrbit.phpt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ try {
4444

4545
echo "Done\n";
4646
?>
47-
--EXPECT--
47+
--EXPECTF--
4848
string(1) "0"
49-
gmp_clrbit(): Argument #2 ($index) must be greater than or equal to 0
49+
gmp_clrbit(): Argument #2 ($index) must be between 0 and %d * %d
5050
string(2) "-1"
51-
gmp_clrbit(): Argument #2 ($index) must be greater than or equal to 0
51+
gmp_clrbit(): Argument #2 ($index) must be between 0 and %d * %d
5252
string(7) "1000000"
5353
string(7) "1000000"
5454
string(30) "238462734628347239571822592658"

ext/gmp/tests/gmp_scan0.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ try {
2727

2828
echo "Done\n";
2929
?>
30-
--EXPECT--
31-
gmp_scan0(): Argument #2 ($start) must be greater than or equal to 0
30+
--EXPECTF--
31+
gmp_scan0(): Argument #2 ($start) must be between 0 and %d * %d
3232
int(2)
3333
int(0)
3434
int(5)

ext/gmp/tests/gmp_scan1.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ try {
2727

2828
echo "Done\n";
2929
?>
30-
--EXPECT--
31-
gmp_scan1(): Argument #2 ($start) must be greater than or equal to 0
30+
--EXPECTF--
31+
gmp_scan1(): Argument #2 ($start) must be between 0 and %d * %d
3232
int(1)
3333
int(12)
3434
int(9)

ext/gmp/tests/gmp_setbit.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ try {
5050

5151
echo "Done\n";
5252
?>
53-
--EXPECT--
53+
--EXPECTF--
5454
string(2) "-1"
55-
gmp_setbit(): Argument #2 ($index) must be greater than or equal to 0
55+
gmp_setbit(): Argument #2 ($index) must be between 0 and %d * %d
5656
string(1) "5"
5757
string(1) "1"
5858
string(1) "7"

ext/gmp/tests/gmp_setbit_long.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,5 @@ FFFFFFFF
4141
3FFFFFFFF
4242
FFFFFFFFF
4343
3FFFFFFFFF
44-
gmp_setbit(): Argument #2 ($index) must be less than %d * %d
44+
gmp_setbit(): Argument #2 ($index) must be between 0 and %d * %d
4545
Done

ext/gmp/tests/gmp_testbit.phpt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,13 @@ var_dump(gmp_strval($n));
4747

4848
echo "Done\n";
4949
?>
50-
--EXPECT--
51-
gmp_testbit(): Argument #2 ($index) must be greater than or equal to 0
50+
--EXPECTF--
51+
gmp_testbit(): Argument #2 ($index) must be between 0 and %d * %d
5252
bool(false)
5353
bool(false)
5454
bool(false)
5555
bool(true)
56-
gmp_testbit(): Argument #2 ($index) must be greater than or equal to 0
56+
gmp_testbit(): Argument #2 ($index) must be between 0 and %d * %d
5757
bool(false)
5858
bool(true)
5959
string(7) "1000002"

0 commit comments

Comments
 (0)