@@ -879,15 +879,15 @@ PHPAPI zend_long php_mt_rand_range(zend_long min, zend_long max)
879
879
* rand() allows min > max, mt_rand does not */
880
880
PHPAPI zend_long php_mt_rand_common (zend_long min , zend_long max )
881
881
{
882
- int64_t n ;
882
+ uint64_t n ;
883
883
884
884
if (RANDOM_G (mt ).mode == MT_RAND_MT19937 ) {
885
885
return php_mt_rand_range (min , max );
886
886
}
887
887
888
888
/* Legacy mode deliberately not inside php_mt_rand_range()
889
889
* to prevent other functions being affected */
890
- n = (int64_t ) php_mt_rand () >> 1 ;
890
+ n = (uint64_t ) php_mt_rand () >> 1 ;
891
891
RAND_RANGE_BADSCALING (n , min , max , PHP_MT_RAND_MAX );
892
892
893
893
return n ;
@@ -1077,7 +1077,7 @@ PHPAPI void *php_random_engine_get_default_state(void)
1077
1077
/* }}} */
1078
1078
1079
1079
/* {{{ php_random_engine_range */
1080
- PHPAPI int64_t php_random_engine_range (const php_random_engine_algo * algo , void * state , zend_long min , zend_long max , bool * engine_unsafe )
1080
+ PHPAPI uint64_t php_random_engine_range (const php_random_engine_algo * algo , void * state , zend_long min , zend_long max , bool * engine_unsafe )
1081
1081
{
1082
1082
zend_ulong umax = max - min ;
1083
1083
@@ -1086,7 +1086,7 @@ PHPAPI int64_t php_random_engine_range(const php_random_engine_algo *algo, void
1086
1086
return rand_range64 (algo , state , umax , engine_unsafe ) + min ;
1087
1087
}
1088
1088
1089
- return ((int64_t ) rand_range32 (algo , state , umax , engine_unsafe )) + min ;
1089
+ return ((uint64_t ) rand_range32 (algo , state , umax , engine_unsafe )) + min ;
1090
1090
}
1091
1091
/* }}} */
1092
1092
@@ -1136,7 +1136,7 @@ PHP_FUNCTION(mt_rand)
1136
1136
int argc = ZEND_NUM_ARGS ();
1137
1137
1138
1138
if (argc == 0 ) {
1139
- // genrand_int31 in mt19937ar.c performs a right shift
1139
+ /* genrand_int31 in mt19937ar.c performs a right shift */
1140
1140
RETURN_LONG (php_mt_rand () >> 1 );
1141
1141
}
1142
1142
@@ -1174,7 +1174,7 @@ PHP_FUNCTION(rand)
1174
1174
int argc = ZEND_NUM_ARGS ();
1175
1175
1176
1176
if (argc == 0 ) {
1177
- // genrand_int31 in mt19937ar.c performs a right shift
1177
+ /* genrand_int31 in mt19937ar.c performs a right shift */
1178
1178
RETURN_LONG (php_mt_rand () >> 1 );
1179
1179
}
1180
1180
@@ -1556,18 +1556,23 @@ PHP_METHOD(Random_Randomizer, __construct)
1556
1556
PHP_METHOD (Random_Randomizer , getInt )
1557
1557
{
1558
1558
php_random_randomizer * randomizer = Z_RANDOM_RANDOMIZER_P (ZEND_THIS );
1559
- zend_long min , max , result ;
1559
+ uint64_t result ;
1560
+ zend_long min , max ;
1561
+ size_t generate_size = 0 ;
1560
1562
int argc = ZEND_NUM_ARGS ();
1561
1563
bool engine_unsafe = false;
1562
1564
1563
1565
if (argc == 0 ) {
1564
- // right shift for compatibility
1565
- result = (zend_long ) (randomizer -> algo -> generate (randomizer -> state , & engine_unsafe ) >> 1 );
1566
+ RANDOM_ENGINE_GENERATE (randomizer -> algo , randomizer -> state , result , generate_size , & engine_unsafe );
1567
+ if (generate_size > sizeof (zend_long )) {
1568
+ zend_throw_exception (spl_ce_RuntimeException , "Generated value exceeds size of int" , 0 );
1569
+ RETURN_THROWS ();
1570
+ }
1566
1571
if (engine_unsafe ) {
1567
1572
zend_throw_exception (spl_ce_RuntimeException , "Random number generate failed" , 0 );
1568
1573
RETURN_THROWS ();
1569
1574
}
1570
- RETURN_LONG (result );
1575
+ RETURN_LONG (( zend_long ) result >> 1 );
1571
1576
}
1572
1577
1573
1578
ZEND_PARSE_PARAMETERS_START (2 , 2 )
@@ -1586,7 +1591,7 @@ PHP_METHOD(Random_Randomizer, getInt)
1586
1591
RETURN_THROWS ();
1587
1592
}
1588
1593
1589
- RETURN_LONG (result );
1594
+ RETURN_LONG (( zend_long ) result );
1590
1595
}
1591
1596
/* }}} */
1592
1597
0 commit comments