File tree Expand file tree Collapse file tree 4 files changed +28
-6
lines changed Expand file tree Collapse file tree 4 files changed +28
-6
lines changed Original file line number Diff line number Diff line change @@ -45,6 +45,8 @@ PHP NEWS
4545 . Fixed floating point exception bug with gmp_pow when using
4646 large exposant values. (David Carlier).
4747 . Fixed bug GH-16411 (gmp_export() can cause overflow). (cmb)
48+ . Fixed bug GH-16501 (gmp_random_bits() can cause overflow).
49+ (David Carlier)
4850
4951- MBstring:
5052 . Fixed bug GH-16361 (mb_substr overflow on start/length arguments).
Original file line number Diff line number Diff line change @@ -1803,15 +1803,21 @@ ZEND_FUNCTION(gmp_random_bits)
18031803 RETURN_THROWS ();
18041804 }
18051805
1806- if (bits <= 0 ) {
1807- zend_argument_value_error (1 , "must be greater than or equal to 1" );
1806+ #if SIZEOF_SIZE_T == 4
1807+ const zend_long maxbits = ULONG_MAX / GMP_NUMB_BITS ;
1808+ #else
1809+ const zend_long maxbits = INT_MAX ;
1810+ #endif
1811+
1812+ if (bits <= 0 || bits > maxbits ) {
1813+ zend_argument_value_error (1 , "must be between 1 and " ZEND_LONG_FMT , maxbits );
18081814 RETURN_THROWS ();
18091815 }
18101816
18111817 INIT_GMP_RETVAL (gmpnum_result );
18121818 gmp_init_random ();
18131819
1814- mpz_urandomb (gmpnum_result , GMPG (rand_state ), bits );
1820+ mpz_urandomb (gmpnum_result , GMPG (rand_state ), ( mp_bitcnt_t ) bits );
18151821}
18161822/* }}} */
18171823
Original file line number Diff line number Diff line change 1+ --TEST--
2+ GH-16501 (gmp_random_bits overflow)
3+ --EXTENSIONS--
4+ gmp
5+ --FILE--
6+ <?php
7+ try {
8+ gmp_random_bits (PHP_INT_MAX );
9+ } catch (\ValueError $ e ) {
10+ echo $ e ->getMessage ();
11+ }
12+ ?>
13+ --EXPECTF--
14+ gmp_random_bits(): Argument #1 ($bits) must be between 1 and %d
Original file line number Diff line number Diff line change @@ -40,7 +40,7 @@ while (1) {
4040
4141echo "Done \n" ;
4242?>
43- --EXPECT --
44- gmp_random_bits(): Argument #1 ($bits) must be greater than or equal to 1
45- gmp_random_bits(): Argument #1 ($bits) must be greater than or equal to 1
43+ --EXPECTF --
44+ gmp_random_bits(): Argument #1 ($bits) must be between 1 and %d
45+ gmp_random_bits(): Argument #1 ($bits) must be between 1 and %d
4646Done
You can’t perform that action at this time.
0 commit comments