summaryrefslogtreecommitdiff
path: root/Zend/zend_operators.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2016-12-02 15:13:55 +0300
committerDmitry Stogov <dmitry@zend.com>2016-12-02 15:13:55 +0300
commit2b70d44b57a4ec3b449c70e6deb547415c2623e7 (patch)
treeb2ea2c2feeb4d25868a946a0e37e842272e85219 /Zend/zend_operators.c
parentdbf39cddd93ad06ce0353695bd02d448a5d6dac9 (diff)
downloadphp-git-2b70d44b57a4ec3b449c70e6deb547415c2623e7.tar.gz
Fixed behavior of failing compound assignments (they shouldn't change the source value when exception thrown during type converion).
Diffstat (limited to 'Zend/zend_operators.c')
-rw-r--r--Zend/zend_operators.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index 0d3c8e46e7..96571da53e 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -1628,6 +1628,10 @@ ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2) /
ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_CONCAT, concat_function);
use_copy1 = zend_make_printable_zval(op1, &op1_copy);
if (use_copy1) {
+ if (UNEXPECTED(EG(exception))) {
+ zval_dtor(&op1_copy);
+ return FAILURE;
+ }
if (result == op1) {
if (UNEXPECTED(op1 == op2)) {
op2 = &op1_copy;
@@ -1646,6 +1650,13 @@ ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2) /
ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_CONCAT);
use_copy2 = zend_make_printable_zval(op2, &op2_copy);
if (use_copy2) {
+ if (UNEXPECTED(EG(exception))) {
+ if (UNEXPECTED(use_copy1)) {
+ zval_dtor(op1);
+ }
+ zval_dtor(&op2_copy);
+ return FAILURE;
+ }
op2 = &op2_copy;
}
}