Skip to content

Commit b763baf

Browse files
committed
Temporary fix for lazy symbol table initialization called from zemd_error(), that converts CV variables into IS_INDIRECT
1 parent 3733737 commit b763baf

File tree

2 files changed

+167
-55
lines changed

2 files changed

+167
-55
lines changed

Zend/zend_vm_def.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMP|VAR
333333
zend_free_op free_op1, free_op2, free_op_data1;
334334
zval *object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
335335
zval *property = GET_OP2_ZVAL_PTR(BP_VAR_R);
336-
zval *value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
336+
zval *value;
337337
int have_get_ptr = 0;
338338

339339
if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_TYPE_P(object) == IS_STR_OFFSET)) {
@@ -342,6 +342,13 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMP|VAR
342342

343343
make_real_object(object TSRMLS_CC);
344344

345+
//???: object may become INDIRECT
346+
if (OP1_TYPE == IS_CV && Z_TYPE_P(object) == IS_INDIRECT) {
347+
object = Z_INDIRECT_P(object);
348+
}
349+
350+
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
351+
345352
if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
346353
zend_error(E_WARNING, "Attempt to assign property of non-object");
347354
FREE_OP2();
@@ -1040,7 +1047,7 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, UNUSED|CONST|
10401047
} else {
10411048
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
10421049
//???: STRING may become INDIRECT
1043-
if (Z_TYPE_P(varname) == IS_INDIRECT) {
1050+
if (OP1_TYPE == IS_CV && Z_TYPE_P(varname) == IS_INDIRECT) {
10441051
varname = Z_INDIRECT_P(varname);
10451052
}
10461053
/*
@@ -4038,7 +4045,7 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
40384045
} else {
40394046
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
40404047
//???: STRING may become INDIRECT
4041-
if (Z_TYPE_P(varname) == IS_INDIRECT) {
4048+
if (OP1_TYPE == IS_CV && Z_TYPE_P(varname) == IS_INDIRECT) {
40424049
varname = Z_INDIRECT_P(varname);
40434050
}
40444051
zend_delete_variable(execute_data, target_symbol_table, Z_STR_P(varname) TSRMLS_CC);
@@ -4556,7 +4563,7 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
45564563
} else {
45574564
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
45584565
//???: STRING may become INDIRECT
4559-
if (Z_TYPE_P(varname) == IS_INDIRECT) {
4566+
if (OP1_TYPE == IS_CV && Z_TYPE_P(varname) == IS_INDIRECT) {
45604567
varname = Z_INDIRECT_P(varname);
45614568
}
45624569
if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {

0 commit comments

Comments
 (0)