Skip to content

Commit 5795dfd

Browse files
committed
Fix bug #79599 in a different way
Move the emission of the undefined variable notice before the array separation.
1 parent a3cb612 commit 5795dfd

File tree

3 files changed

+77
-116
lines changed

3 files changed

+77
-116
lines changed

Zend/tests/bug79599.phpt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
Bug #79599 (coredump in set_error_handler)
3+
--FILE--
4+
<?php
5+
set_error_handler(function($code, $message){
6+
throw new \Exception($message);
7+
});
8+
function test1(){
9+
$a[] = $b;
10+
}
11+
function test2(){
12+
$a[$c] = $b;
13+
}
14+
try{
15+
test1();
16+
}catch(\Exception $e){
17+
var_dump($e->getMessage());
18+
}
19+
try{
20+
test2();
21+
}catch(\Exception $e){
22+
var_dump($e->getMessage());
23+
}
24+
?>
25+
--EXPECT--
26+
string(21) "Undefined variable: b"
27+
string(21) "Undefined variable: b"

Zend/zend_vm_def.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2619,15 +2619,14 @@ ZEND_VM_HANDLER(23, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(O
26192619

26202620
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
26212621
ZEND_VM_C_LABEL(try_assign_dim_array):
2622+
value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
26222623
SEPARATE_ARRAY(object_ptr);
26232624
if (OP2_TYPE == IS_UNUSED) {
2624-
value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
26252625
if (OP_DATA_TYPE == IS_CV || OP_DATA_TYPE == IS_VAR) {
26262626
ZVAL_DEREF(value);
26272627
}
26282628
variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
26292629
if (UNEXPECTED(variable_ptr == NULL)) {
2630-
FREE_OP_DATA();
26312630
zend_cannot_add_element();
26322631
ZEND_VM_C_GOTO(assign_dim_error);
26332632
} else if (OP_DATA_TYPE == IS_CV) {
@@ -2656,7 +2655,6 @@ ZEND_VM_C_LABEL(try_assign_dim_array):
26562655
if (UNEXPECTED(variable_ptr == NULL)) {
26572656
ZEND_VM_C_GOTO(assign_dim_error);
26582657
}
2659-
value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
26602658
value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES());
26612659
}
26622660
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -2707,7 +2705,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array):
27072705
}
27082706
dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
27092707
ZEND_VM_C_LABEL(assign_dim_error):
2710-
FREE_UNFETCHED_OP_DATA();
2708+
FREE_OP_DATA();
27112709
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
27122710
ZVAL_NULL(EX_VAR(opline->result.var));
27132711
}

0 commit comments

Comments
 (0)