summaryrefslogtreecommitdiff
path: root/Zend/zend_vm_execute.h
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2016-10-12 16:07:56 +0800
committerAnatol Belski <ab@php.net>2016-10-14 01:35:39 +0200
commitc9274d20b73658d2e560f6a79b6b7c3bbb935e3e (patch)
tree55c56f6969d2993424c2e6778643fe1d82ddbd0f /Zend/zend_vm_execute.h
parent25d4943b44a35cab30a18572bb957a6b1aa45301 (diff)
downloadphp-git-c9274d20b73658d2e560f6a79b6b7c3bbb935e3e.tar.gz
Fixed bug #73288 (Segfault in __clone > Exception.toString > __get)
Actually this is caused by optimization(opcache) (cherry picked from commit d19898b2981c839f0758571c1b83052111634154)
Diffstat (limited to 'Zend/zend_vm_execute.h')
-rw-r--r--Zend/zend_vm_execute.h36
1 files changed, 24 insertions, 12 deletions
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index f0b03d91c4..4c09072545 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -3231,6 +3231,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_
USE_OPLINE
zval *obj;
+ zend_object *clone_obj;
zend_class_entry *ce, *scope;
zend_function *clone;
zend_object_clone_obj_t clone_call;
@@ -3295,9 +3296,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_
}
}
- ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
+ clone_obj = clone_call(obj);
+ if (EXPECTED(EG(exception) == NULL)) {
+ ZVAL_OBJ(EX_VAR(opline->result.var), clone_obj);
+ } else {
+ OBJ_RELEASE(clone_obj);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -27847,6 +27850,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND
USE_OPLINE
zval *obj;
+ zend_object *clone_obj;
zend_class_entry *ce, *scope;
zend_function *clone;
zend_object_clone_obj_t clone_call;
@@ -27911,9 +27915,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND
}
}
- ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
+ clone_obj = clone_call(obj);
+ if (EXPECTED(EG(exception) == NULL)) {
+ ZVAL_OBJ(EX_VAR(opline->result.var), clone_obj);
+ } else {
+ OBJ_RELEASE(clone_obj);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -35170,6 +35176,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC
USE_OPLINE
zval *obj;
+ zend_object *clone_obj;
zend_class_entry *ce, *scope;
zend_function *clone;
zend_object_clone_obj_t clone_call;
@@ -35234,9 +35241,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC
}
}
- ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
+ clone_obj = clone_call(obj);
+ if (EXPECTED(EG(exception) == NULL)) {
+ ZVAL_OBJ(EX_VAR(opline->result.var), clone_obj);
+ } else {
+ OBJ_RELEASE(clone_obj);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -51389,6 +51398,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND
USE_OPLINE
zend_free_op free_op1;
zval *obj;
+ zend_object *clone_obj;
zend_class_entry *ce, *scope;
zend_function *clone;
zend_object_clone_obj_t clone_call;
@@ -51453,9 +51463,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND
}
}
- ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
+ clone_obj = clone_call(obj);
+ if (EXPECTED(EG(exception) == NULL)) {
+ ZVAL_OBJ(EX_VAR(opline->result.var), clone_obj);
+ } else {
+ OBJ_RELEASE(clone_obj);
}
zval_ptr_dtor_nogc(free_op1);