Skip to content

Commit 20a23c9

Browse files
committed
Merge branch 'PHP-8.1'
* PHP-8.1: JIT: Fixed memory leak
2 parents 9962aa9 + 9bccbf8 commit 20a23c9

File tree

3 files changed

+26
-2
lines changed

3 files changed

+26
-2
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4970,6 +4970,7 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o
49704970
if (op2_info & MAY_BE_LONG) {
49714971
bool op2_loaded = 0;
49724972
bool packed_loaded = 0;
4973+
bool bad_packed_key = 0;
49734974

49744975
if (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - MAY_BE_LONG)) {
49754976
| // if (EXPECTED(Z_TYPE_P(dim) == IS_LONG))
@@ -5004,6 +5005,8 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o
50045005
val = Z_LVAL_P(Z_ZV(op2_addr));
50055006
if (val >= 0 && val < HT_MAX_SIZE) {
50065007
packed_loaded = 1;
5008+
} else {
5009+
bad_packed_key = 1;
50075010
}
50085011
} else {
50095012
if (!op2_loaded) {
@@ -5217,7 +5220,7 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o
52175220
if (packed_loaded) {
52185221
| IF_NOT_Z_TYPE REG0, IS_UNDEF, >8, TMP1w
52195222
}
5220-
if (!(op1_info & MAY_BE_ARRAY_KEY_LONG) || (op1_info & MAY_BE_ARRAY_NUMERIC_HASH) || packed_loaded || dim_type == IS_UNDEF) {
5223+
if (!(op1_info & MAY_BE_ARRAY_KEY_LONG) || (op1_info & MAY_BE_ARRAY_NUMERIC_HASH) || packed_loaded || bad_packed_key || dim_type == IS_UNDEF) {
52215224
|2:
52225225
|4:
52235226
if (!op2_loaded) {

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5441,6 +5441,7 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o
54415441
if (op2_info & MAY_BE_LONG) {
54425442
bool op2_loaded = 0;
54435443
bool packed_loaded = 0;
5444+
bool bad_packed_key = 0;
54445445

54455446
if (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - MAY_BE_LONG)) {
54465447
| // if (EXPECTED(Z_TYPE_P(dim) == IS_LONG))
@@ -5473,6 +5474,8 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o
54735474
val = Z_LVAL_P(Z_ZV(op2_addr));
54745475
if (val >= 0 && val < HT_MAX_SIZE) {
54755476
packed_loaded = 1;
5477+
} else {
5478+
bad_packed_key = 1;
54765479
}
54775480
} else {
54785481
if (!op2_loaded) {
@@ -5696,7 +5699,7 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o
56965699
if (packed_loaded) {
56975700
| IF_NOT_Z_TYPE r0, IS_UNDEF, >8
56985701
}
5699-
if (!(op1_info & MAY_BE_ARRAY_KEY_LONG) || (op1_info & MAY_BE_ARRAY_NUMERIC_HASH) || packed_loaded || dim_type == IS_UNDEF) {
5702+
if (!(op1_info & MAY_BE_ARRAY_KEY_LONG) || (op1_info & MAY_BE_ARRAY_NUMERIC_HASH) || packed_loaded || bad_packed_key || dim_type == IS_UNDEF) {
57005703
|2:
57015704
|4:
57025705
if (!op2_loaded) {
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
--TEST--
2+
JIT FETCH_DIM_W: 001
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.file_update_protection=0
7+
opcache.jit_buffer_size=1M
8+
--FILE--
9+
<?php
10+
function &foo() {
11+
$a = array(1);
12+
return $a[-1];
13+
}
14+
15+
var_dump(foo());
16+
?>
17+
--EXPECT--
18+
NULL

0 commit comments

Comments
 (0)