@@ -1278,12 +1278,37 @@ ZEND_FUNCTION(gmp_pow)
12781278
12791279 if (Z_TYPE_P (base_arg ) == IS_LONG && Z_LVAL_P (base_arg ) >= 0 ) {
12801280 INIT_GMP_RETVAL (gmpnum_result );
1281- mpz_ui_pow_ui (gmpnum_result , Z_LVAL_P (base_arg ), exp );
1281+ if (exp >= INT_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_ui (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 );
1295+ }
12821296 } else {
12831297 mpz_ptr gmpnum_base ;
12841298 FETCH_GMP_ZVAL (gmpnum_base , base_arg , temp_base , 1 );
12851299 INIT_GMP_RETVAL (gmpnum_result );
1286- mpz_pow_ui (gmpnum_result , gmpnum_base , exp );
1300+ if (exp >= INT_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_ui (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 );
1311+ }
12871312 FREE_GMP_TEMP (temp_base );
12881313 }
12891314}
0 commit comments