Skip to content

Commit 9457608

Browse files
committed
ext/gmp: Check for valid bit index/start consistently
1 parent 0800c68 commit 9457608

File tree

6 files changed

+21
-21
lines changed

6 files changed

+21
-21
lines changed

ext/gmp/gmp.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1539,6 +1539,10 @@ ZEND_FUNCTION(gmp_random_range)
15391539
}
15401540
/* }}} */
15411541

1542+
static bool gmp_is_bit_index_valid(zend_long index) {
1543+
return index >= 0 && (index / GMP_NUMB_BITS < INT_MAX);
1544+
}
1545+
15421546
/* {{{ Sets or clear bit in a */
15431547
ZEND_FUNCTION(gmp_setbit)
15441548
{
@@ -1551,12 +1555,8 @@ ZEND_FUNCTION(gmp_setbit)
15511555
RETURN_THROWS();
15521556
}
15531557

1554-
if (index < 0) {
1555-
zend_argument_value_error(2, "must be greater than or equal to 0");
1556-
RETURN_THROWS();
1557-
}
1558-
if (index / GMP_NUMB_BITS >= INT_MAX) {
1559-
zend_argument_value_error(2, "must be less than %d * %d", INT_MAX, GMP_NUMB_BITS);
1558+
if (!gmp_is_bit_index_valid(index)) {
1559+
zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
15601560
RETURN_THROWS();
15611561
}
15621562

@@ -1581,8 +1581,8 @@ ZEND_FUNCTION(gmp_clrbit)
15811581
RETURN_THROWS();
15821582
}
15831583

1584-
if (index < 0) {
1585-
zend_argument_value_error(2, "must be greater than or equal to 0");
1584+
if (!gmp_is_bit_index_valid(index)) {
1585+
zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
15861586
RETURN_THROWS();
15871587
}
15881588

@@ -1602,8 +1602,8 @@ ZEND_FUNCTION(gmp_testbit)
16021602
Z_PARAM_LONG(index)
16031603
ZEND_PARSE_PARAMETERS_END();
16041604

1605-
if (index < 0) {
1606-
zend_argument_value_error(2, "must be greater than or equal to 0");
1605+
if (!gmp_is_bit_index_valid(index)) {
1606+
zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
16071607
RETURN_THROWS();
16081608
}
16091609

@@ -1649,8 +1649,8 @@ ZEND_FUNCTION(gmp_scan0)
16491649
Z_PARAM_LONG(start)
16501650
ZEND_PARSE_PARAMETERS_END();
16511651

1652-
if (start < 0) {
1653-
zend_argument_value_error(2, "must be greater than or equal to 0");
1652+
if (!gmp_is_bit_index_valid(start)) {
1653+
zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
16541654
RETURN_THROWS();
16551655
}
16561656

@@ -1669,8 +1669,8 @@ ZEND_FUNCTION(gmp_scan1)
16691669
Z_PARAM_LONG(start)
16701670
ZEND_PARSE_PARAMETERS_END();
16711671

1672-
if (start < 0) {
1673-
zend_argument_value_error(2, "must be greater than or equal to 0");
1672+
if (!gmp_is_bit_index_valid(start)) {
1673+
zend_argument_value_error(2, "must be between 0 and %d * %d", INT_MAX, GMP_NUMB_BITS);
16741674
RETURN_THROWS();
16751675
}
16761676

ext/gmp/tests/gmp_clrbit.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ echo "Done\n";
4646
?>
4747
--EXPECT--
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 2147483647 * 64
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 2147483647 * 64
5252
string(7) "1000000"
5353
string(7) "1000000"
5454
string(30) "238462734628347239571822592658"

ext/gmp/tests/gmp_scan0.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ try {
2828
echo "Done\n";
2929
?>
3030
--EXPECT--
31-
gmp_scan0(): Argument #2 ($start) must be greater than or equal to 0
31+
gmp_scan0(): Argument #2 ($start) must be between 0 and 2147483647 * 64
3232
int(2)
3333
int(0)
3434
int(5)

ext/gmp/tests/gmp_scan1.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ try {
2828
echo "Done\n";
2929
?>
3030
--EXPECT--
31-
gmp_scan1(): Argument #2 ($start) must be greater than or equal to 0
31+
gmp_scan1(): Argument #2 ($start) must be between 0 and 2147483647 * 64
3232
int(1)
3333
int(12)
3434
int(9)

ext/gmp/tests/gmp_setbit.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ echo "Done\n";
5252
?>
5353
--EXPECT--
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 2147483647 * 64
5656
string(1) "5"
5757
string(1) "1"
5858
string(1) "7"

ext/gmp/tests/gmp_testbit.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,12 @@ var_dump(gmp_strval($n));
4848
echo "Done\n";
4949
?>
5050
--EXPECT--
51-
gmp_testbit(): Argument #2 ($index) must be greater than or equal to 0
51+
gmp_testbit(): Argument #2 ($index) must be between 0 and 2147483647 * 64
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 2147483647 * 64
5757
bool(false)
5858
bool(true)
5959
string(7) "1000002"

0 commit comments

Comments
 (0)