Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit bf0c2a8

Browse files
committedOct 12, 2024··
ext/gmp: gmp_pow fix FPE with large values.
even without sanitizers, it is reproducible but with the following ``` <?php $g = gmp_init(256); var_dump(gmp_pow($g, PHP_INT_MAX)); ``` we get this ``` AddressSanitizer:DEADLYSIGNAL ================================================================= ==286922==ERROR: AddressSanitizer: FPE on unknown address 0x03e8000460ca (pc 0x7faf6c69de5c bp 0x400000000000004 sp 0x7ffe9843c740 T0) #0 0x7faf6c69de5c in __pthread_kill_implementation nptl/pthread_kill.c:44 #1 0x7faf6c649c81 in __GI_raise ../sysdeps/posix/raise.c:26 php#2 0x7faf6db9386c in __gmp_exception (/lib/x86_64-linux-gnu/libgmp.so.10+0xd86c) (BuildId: 1af68a49fe041a5bb48a2915c3d47541f713bb38) php#3 0x7faf6db938d3 in __gmp_overflow_in_mpz (/lib/x86_64-linux-gnu/libgmp.so.10+0xd8d3) (BuildId: 1af68a49fe041a5bb48a2915c3d47541f713bb38) php#4 0x7faf6dbac95c in __gmpz_realloc (/lib/x86_64-linux-gnu/libgmp.so.10+0x2695c) (BuildId: 1af68a49fe041a5bb48a2915c3d47541f713bb38) php#5 0x7faf6dba9038 in __gmpz_n_pow_ui (/lib/x86_64-linux-gnu/libgmp.so.10+0x23038) (BuildId: 1af68a49fe041a5bb48a2915c3d47541f713bb38) php#6 0x5565ae1ccd9f in zif_gmp_pow /home/dcarlier/Contribs/php-src/ext/gmp/gmp.c:1286 php#7 0x5565aee96ea9 in ZEND_DO_ICALL_SPEC_RETVAL_USED_HANDLER /home/dcarlier/Contribs/php-src/Zend/zend_vm_execute.h:1312 php#8 0x5565af144320 in execute_ex /home/dcarlier/Contribs/php-src/Zend/zend_vm_execute.h:56075 php#9 0x5565af160f07 in zend_execute /home/dcarlier/Contribs/php-src/Zend/zend_vm_execute.h:60439 php#10 0x5565aed6fafe in zend_execute_scripts /home/dcarlier/Contribs/php-src/Zend/zend.c:1842 php#11 0x5565aeae70a8 in php_execute_script /home/dcarlier/Contribs/php-src/main/main.c:2578 php#12 0x5565af532f4e in do_cli /home/dcarlier/Contribs/php-src/sapi/cli/php_cli.c:964 php#13 0x5565af535877 in main /home/dcarlier/Contribs/php-src/sapi/cli/php_cli.c:1334 php#14 0x7faf6c633d67 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58 php#15 0x7faf6c633e24 in __libc_start_main_impl ../csu/libc-start.c:360 php#16 0x5565adc04040 in _start (/home/dcarlier/Contribs/php-src/sapi/cli/php+0x2604040) (BuildId: 949049955bdf8b7197390b1978a1dfc3ef6fdf38) AddressSanitizer can not provide additional info. SUMMARY: AddressSanitizer: FPE nptl/pthread_kill.c:44 in __pthread_kill_implementation ==286922==ABORTING ```
1 parent e8ef81a commit bf0c2a8

File tree

1 file changed

+10
-0
lines changed

1 file changed

+10
-0
lines changed
 

‎ext/gmp/gmp.c

+10
Original file line numberDiff line numberDiff line change
@@ -1278,11 +1278,21 @@ 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+
if ((log10(Z_LVAL_P(base_arg)) * exp) > (double)ULONG_MAX) {
1282+
zend_value_error("base and exponent overflow");
1283+
RETURN_THROWS();
1284+
}
12811285
mpz_ui_pow_ui(gmpnum_result, Z_LVAL_P(base_arg), exp);
12821286
} else {
12831287
mpz_ptr gmpnum_base;
1288+
unsigned long gmpnum;
12841289
FETCH_GMP_ZVAL(gmpnum_base, base_arg, temp_base, 1);
12851290
INIT_GMP_RETVAL(gmpnum_result);
1291+
gmpnum = mpz_get_ui(gmpnum_base);
1292+
if ((log10(gmpnum) * exp) > (double)ULONG_MAX) {
1293+
zend_value_error("base and exponent overflow");
1294+
RETURN_THROWS();
1295+
}
12861296
mpz_pow_ui(gmpnum_result, gmpnum_base, exp);
12871297
FREE_GMP_TEMP(temp_base);
12881298
}

0 commit comments

Comments
 (0)
Please sign in to comment.