Skip to content

Commit 0ce7487

Browse files
committed
Fixed access to memory that is already freed (in case of __call() method)
1 parent 46488c8 commit 0ce7487

File tree

2 files changed

+6
-2
lines changed

2 files changed

+6
-2
lines changed

Zend/zend_vm_def.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1830,6 +1830,8 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
18301830
}
18311831
}
18321832
if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
1833+
unsigned char return_reference = EX(function_state).function->common.return_reference;
1834+
18331835
ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
18341836
INIT_ZVAL(*(EX_T(opline->result.u.var).var.ptr));
18351837

@@ -1865,7 +1867,7 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
18651867
if (!return_value_used) {
18661868
zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
18671869
} else {
1868-
EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
1870+
EX_T(opline->result.u.var).var.fcall_returned_reference = return_reference;
18691871
}
18701872
} else if (EX(function_state).function->type == ZEND_USER_FUNCTION) {
18711873
HashTable *calling_symbol_table;

Zend/zend_vm_execute.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ static int zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
163163
}
164164
}
165165
if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
166+
unsigned char return_reference = EX(function_state).function->common.return_reference;
167+
166168
ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
167169
INIT_ZVAL(*(EX_T(opline->result.u.var).var.ptr));
168170

@@ -198,7 +200,7 @@ static int zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
198200
if (!return_value_used) {
199201
zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
200202
} else {
201-
EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
203+
EX_T(opline->result.u.var).var.fcall_returned_reference = return_reference;
202204
}
203205
} else if (EX(function_state).function->type == ZEND_USER_FUNCTION) {
204206
HashTable *calling_symbol_table;

0 commit comments

Comments
 (0)