Skip to content

Commit 0becd48

Browse files
committed
Merge branch 'PHP-8.2' into PHP-8.3
* PHP-8.2: Fix phpGH-12481: PHP crash with JIT enabled
2 parents fae27cd + f120ac9 commit 0becd48

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4443,8 +4443,14 @@ static int zend_jit_math_long_long(dasm_State **Dst,
44434443
} else {
44444444
zend_reg tmp_reg;
44454445

4446-
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
4447-
tmp_reg = ZREG_R1;
4446+
if (Z_MODE(res_addr) == IS_MEM_ZVAL) {
4447+
if (Z_REG(res_addr) != ZREG_R0 && result_reg != ZREG_R0) {
4448+
tmp_reg = ZREG_R0;
4449+
} else if (Z_REG(res_addr) != ZREG_R1 && result_reg != ZREG_R1) {
4450+
tmp_reg = ZREG_R1;
4451+
} else {
4452+
tmp_reg = ZREG_R2;
4453+
}
44484454
} else if (result_reg != ZREG_R0) {
44494455
tmp_reg = ZREG_R0;
44504456
} else {
@@ -5312,8 +5318,16 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
53125318
} else {
53135319
zend_reg tmp_reg;
53145320

5315-
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
5316-
tmp_reg = ZREG_R1;
5321+
if (Z_MODE(res_addr) == IS_MEM_ZVAL) {
5322+
if (Z_REG(res_addr) != ZREG_R0 && result_reg != ZREG_R0) {
5323+
tmp_reg = ZREG_R0;
5324+
} else if (Z_REG(res_addr) != ZREG_R1 && result_reg != ZREG_R1) {
5325+
tmp_reg = ZREG_R1;
5326+
} else {
5327+
tmp_reg = ZREG_R2;
5328+
}
5329+
} else if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R1) {
5330+
tmp_reg = ZREG_R0;
53175331
} else if (result_reg != ZREG_R0) {
53185332
tmp_reg = ZREG_R0;
53195333
} else {

ext/opcache/tests/jit/gh12481.phpt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
GH-12481: PHP crash on Windows 64-bit with JIT enabled
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
--FILE--
7+
<?php
8+
function foo(&$var) {
9+
$var &= 0xFFFFFFFF;
10+
return intval($var);
11+
}
12+
$v = 0x7FFFFFFF1;
13+
for ($i = 0; $i < 10; $i++) {
14+
foo($v);
15+
}
16+
?>
17+
DONE
18+
--EXPECTF--
19+
DONE

0 commit comments

Comments
 (0)