@@ -1288,12 +1288,37 @@ ZEND_FUNCTION(gmp_pow)
12881288
12891289 if (Z_TYPE_P (base_arg ) == IS_LONG && Z_LVAL_P (base_arg ) >= 0 ) {
12901290 INIT_GMP_RETVAL (gmpnum_result );
1291- mpz_ui_pow_ui (gmpnum_result , Z_LVAL_P (base_arg ), exp );
1291+ if (exp >= INT_MAX ) {
1292+ mpz_t base_num , exp_num , mod ;
1293+ mpz_init (base_num );
1294+ mpz_init (exp_num );
1295+ mpz_init (mod );
1296+ mpz_set_si (base_num , Z_LVAL_P (base_arg ));
1297+ mpz_set_si (exp_num , exp );
1298+ mpz_set_ui (mod , UINT_MAX );
1299+ mpz_powm (gmpnum_result , base_num , exp_num , mod );
1300+ mpz_clear (mod );
1301+ mpz_clear (exp_num );
1302+ mpz_clear (base_num );
1303+ } else {
1304+ mpz_ui_pow_ui (gmpnum_result , Z_LVAL_P (base_arg ), exp );
1305+ }
12921306 } else {
12931307 mpz_ptr gmpnum_base ;
12941308 FETCH_GMP_ZVAL (gmpnum_base , base_arg , temp_base , 1 );
12951309 INIT_GMP_RETVAL (gmpnum_result );
1296- mpz_pow_ui (gmpnum_result , gmpnum_base , exp );
1310+ if (exp >= INT_MAX ) {
1311+ mpz_t exp_num , mod ;
1312+ mpz_init (exp_num );
1313+ mpz_init (mod );
1314+ mpz_set_si (exp_num , exp );
1315+ mpz_set_ui (mod , UINT_MAX );
1316+ mpz_powm (gmpnum_result , gmpnum_base , exp_num , mod );
1317+ mpz_clear (mod );
1318+ mpz_clear (exp_num );
1319+ } else {
1320+ mpz_pow_ui (gmpnum_result , gmpnum_base , exp );
1321+ }
12971322 FREE_GMP_TEMP (temp_base );
12981323 }
12991324}
0 commit comments