diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-08-10 10:12:49 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-08-10 10:13:34 +0200 |
commit | 74c43818066585a5155c6c07b46b3d1727fd14b8 (patch) | |
tree | 4ad63507b6f96e62da2dbe48b8dd49364599e469 | |
parent | da0a0a13be320a88173594c3e96394134c5c24c6 (diff) | |
parent | 2d087210ebb8adc06dcaca37b9d2dcb93ea2156c (diff) | |
download | php-git-74c43818066585a5155c6c07b46b3d1727fd14b8.tar.gz |
Merge branch 'PHP-7.4'
* PHP-7.4:
Fixed bug #79947
-rw-r--r-- | Zend/tests/bug79947.phpt | 17 | ||||
-rw-r--r-- | Zend/zend_execute.c | 1 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 1 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 8 |
4 files changed, 26 insertions, 1 deletions
diff --git a/Zend/tests/bug79947.phpt b/Zend/tests/bug79947.phpt new file mode 100644 index 0000000000..906f58144b --- /dev/null +++ b/Zend/tests/bug79947.phpt @@ -0,0 +1,17 @@ +--TEST-- +Bug #79947: Memory leak on invalid offset type in compound assignment +--FILE-- +<?php +$array = []; +$key = []; +try { + $array[$key] += [$key]; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($array); +?> +--EXPECT-- +Illegal offset type +array(0) { +} diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 7d2a960cb5..9a267987db 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2002,7 +2002,6 @@ static ZEND_COLD void zend_binary_assign_op_dim_slow(zval *container, zval *dim } else { zend_use_scalar_as_array(); } - FREE_OP((opline+1)->op1_type, (opline+1)->op1.var); } static zend_never_inline zend_uchar slow_index_convert(HashTable *ht, const zval *dim, zend_value *value EXECUTE_DATA_DC) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 86a86bd652..c5583feb66 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1215,6 +1215,7 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array): } else { zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); ZEND_VM_C_LABEL(assign_dim_op_ret_null): + FREE_OP_DATA(); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 4f118764a8..b9ccb2226c 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -21431,6 +21431,7 @@ assign_dim_op_new_array: } else { zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); assign_dim_op_ret_null: + FREE_OP((opline+1)->op1_type, (opline+1)->op1.var); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } @@ -23976,6 +23977,7 @@ assign_dim_op_new_array: } else { zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); assign_dim_op_ret_null: + FREE_OP((opline+1)->op1_type, (opline+1)->op1.var); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } @@ -26201,6 +26203,7 @@ assign_dim_op_new_array: } else { zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); assign_dim_op_ret_null: + FREE_OP((opline+1)->op1_type, (opline+1)->op1.var); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } @@ -27911,6 +27914,7 @@ assign_dim_op_new_array: } else { zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); assign_dim_op_ret_null: + FREE_OP((opline+1)->op1_type, (opline+1)->op1.var); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } @@ -38602,6 +38606,7 @@ assign_dim_op_new_array: } else { zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); assign_dim_op_ret_null: + FREE_OP((opline+1)->op1_type, (opline+1)->op1.var); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } @@ -42214,6 +42219,7 @@ assign_dim_op_new_array: } else { zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); assign_dim_op_ret_null: + FREE_OP((opline+1)->op1_type, (opline+1)->op1.var); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } @@ -45003,6 +45009,7 @@ assign_dim_op_new_array: } else { zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); assign_dim_op_ret_null: + FREE_OP((opline+1)->op1_type, (opline+1)->op1.var); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } @@ -47251,6 +47258,7 @@ assign_dim_op_new_array: } else { zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); assign_dim_op_ret_null: + FREE_OP((opline+1)->op1_type, (opline+1)->op1.var); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } |