Skip to content

Commit 74c4381

Browse files
committed
Merge branch 'PHP-7.4'
* PHP-7.4: Fixed bug #79947
2 parents da0a0a1 + 2d08721 commit 74c4381

File tree

4 files changed

+26
-1
lines changed

4 files changed

+26
-1
lines changed

Zend/tests/bug79947.phpt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--TEST--
2+
Bug #79947: Memory leak on invalid offset type in compound assignment
3+
--FILE--
4+
<?php
5+
$array = [];
6+
$key = [];
7+
try {
8+
$array[$key] += [$key];
9+
} catch (TypeError $e) {
10+
echo $e->getMessage(), "\n";
11+
}
12+
var_dump($array);
13+
?>
14+
--EXPECT--
15+
Illegal offset type
16+
array(0) {
17+
}

Zend/zend_execute.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2002,7 +2002,6 @@ static ZEND_COLD void zend_binary_assign_op_dim_slow(zval *container, zval *dim
20022002
} else {
20032003
zend_use_scalar_as_array();
20042004
}
2005-
FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
20062005
}
20072006

20082007
static zend_never_inline zend_uchar slow_index_convert(HashTable *ht, const zval *dim, zend_value *value EXECUTE_DATA_DC)

Zend/zend_vm_def.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1215,6 +1215,7 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array):
12151215
} else {
12161216
zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
12171217
ZEND_VM_C_LABEL(assign_dim_op_ret_null):
1218+
FREE_OP_DATA();
12181219
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
12191220
ZVAL_NULL(EX_VAR(opline->result.var));
12201221
}

Zend/zend_vm_execute.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21431,6 +21431,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_CONST_H
2143121431
} else {
2143221432
zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
2143321433
assign_dim_op_ret_null:
21434+
FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
2143421435
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
2143521436
ZVAL_NULL(EX_VAR(opline->result.var));
2143621437
}
@@ -23976,6 +23977,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_TMPVAR_
2397623977
} else {
2397723978
zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
2397823979
assign_dim_op_ret_null:
23980+
FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
2397923981
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
2398023982
ZVAL_NULL(EX_VAR(opline->result.var));
2398123983
}
@@ -26201,6 +26203,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_UNUSED_
2620126203
} else {
2620226204
zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
2620326205
assign_dim_op_ret_null:
26206+
FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
2620426207
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
2620526208
ZVAL_NULL(EX_VAR(opline->result.var));
2620626209
}
@@ -27911,6 +27914,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_CV_HAND
2791127914
} else {
2791227915
zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
2791327916
assign_dim_op_ret_null:
27917+
FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
2791427918
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
2791527919
ZVAL_NULL(EX_VAR(opline->result.var));
2791627920
}
@@ -38602,6 +38606,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_CONST_HA
3860238606
} else {
3860338607
zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
3860438608
assign_dim_op_ret_null:
38609+
FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
3860538610
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
3860638611
ZVAL_NULL(EX_VAR(opline->result.var));
3860738612
}
@@ -42214,6 +42219,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_TMPVAR_H
4221442219
} else {
4221542220
zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
4221642221
assign_dim_op_ret_null:
42222+
FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
4221742223
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
4221842224
ZVAL_NULL(EX_VAR(opline->result.var));
4221942225
}
@@ -45003,6 +45009,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_UNUSED_H
4500345009
} else {
4500445010
zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
4500545011
assign_dim_op_ret_null:
45012+
FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
4500645013
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
4500745014
ZVAL_NULL(EX_VAR(opline->result.var));
4500845015
}
@@ -47251,6 +47258,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_CV_HANDL
4725147258
} else {
4725247259
zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
4725347260
assign_dim_op_ret_null:
47261+
FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
4725447262
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
4725547263
ZVAL_NULL(EX_VAR(opline->result.var));
4725647264
}

0 commit comments

Comments
 (0)