@@ -1278,23 +1278,37 @@ ZEND_FUNCTION(gmp_pow)
1278
1278
1279
1279
if (Z_TYPE_P (base_arg ) == IS_LONG && Z_LVAL_P (base_arg ) >= 0 ) {
1280
1280
INIT_GMP_RETVAL (gmpnum_result );
1281
- if ((log10 (Z_LVAL_P (base_arg )) * exp ) > (double )ULONG_MAX ) {
1282
- zend_value_error ("base and exponent overflow" );
1283
- RETURN_THROWS ();
1281
+ if (exp > UINT_MAX ) {
1282
+ mpz_t base_num , exp_num , mod ;
1283
+ mpz_init (base_num );
1284
+ mpz_init (exp_num );
1285
+ mpz_init (mod );
1286
+ mpz_set_si (base_num , Z_LVAL_P (base_arg ));
1287
+ mpz_set_si (exp_num , exp );
1288
+ mpz_set_si (mod , UINT_MAX );
1289
+ mpz_powm (gmpnum_result , base_num , exp_num , mod );
1290
+ mpz_clear (mod );
1291
+ mpz_clear (exp_num );
1292
+ mpz_clear (base_num );
1293
+ } else {
1294
+ mpz_ui_pow_ui (gmpnum_result , Z_LVAL_P (base_arg ), exp );
1284
1295
}
1285
- mpz_ui_pow_ui (gmpnum_result , Z_LVAL_P (base_arg ), exp );
1286
1296
} else {
1287
1297
mpz_ptr gmpnum_base ;
1288
- unsigned long gmpnum ;
1289
1298
FETCH_GMP_ZVAL (gmpnum_base , base_arg , temp_base , 1 );
1290
1299
INIT_GMP_RETVAL (gmpnum_result );
1291
- gmpnum = mpz_get_ui (gmpnum_base );
1292
- if ((log10 (gmpnum ) * exp ) > (double )ULONG_MAX ) {
1293
- FREE_GMP_TEMP (temp_base );
1294
- zend_value_error ("base and exponent overflow" );
1295
- RETURN_THROWS ();
1300
+ if (exp > UINT_MAX ) {
1301
+ mpz_t exp_num , mod ;
1302
+ mpz_init (exp_num );
1303
+ mpz_init (mod );
1304
+ mpz_set_si (exp_num , exp );
1305
+ mpz_set_si (mod , UINT_MAX );
1306
+ mpz_powm (gmpnum_result , gmpnum_base , exp_num , mod );
1307
+ mpz_clear (mod );
1308
+ mpz_clear (exp_num );
1309
+ } else {
1310
+ mpz_pow_ui (gmpnum_result , gmpnum_base , exp );
1296
1311
}
1297
- mpz_pow_ui (gmpnum_result , gmpnum_base , exp );
1298
1312
FREE_GMP_TEMP (temp_base );
1299
1313
}
1300
1314
}
0 commit comments