summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2016-10-12 20:09:24 +0200
committerAnatol Belski <ab@php.net>2016-10-12 20:09:24 +0200
commitaf1bf873fe4fc70be17fa9f270e8f30666f2d2db (patch)
treee5f13c713d87f588c74a4389a91247a0f7f59e16 /Zend
parentfa9370db03944b31a9c3b20d586a290fe51ceaa0 (diff)
parent74b5662536ccdf9b7b02c495f02a27c64e27fff7 (diff)
downloadphp-git-af1bf873fe4fc70be17fa9f270e8f30666f2d2db.tar.gz
Merge branch 'PHP-7.0' into PHP-7.1
* PHP-7.0: Fix bug #73190: memcpy negative parameter _bc_new_num_ex
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_exceptions.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c
index dc073de633..4f156c0bcc 100644
--- a/Zend/zend_exceptions.c
+++ b/Zend/zend_exceptions.c
@@ -306,10 +306,7 @@ ZEND_METHOD(exception, __construct)
#define CHECK_EXC_TYPE(id, type) \
pvalue = zend_read_property_ex(i_get_exception_base(object), (object), CG(known_strings)[id], 1, &value); \
if (Z_TYPE_P(pvalue) != IS_NULL && Z_TYPE_P(pvalue) != type) { \
- zval tmp; \
- ZVAL_STR_COPY(&tmp, CG(known_strings)[id]); \
- Z_OBJ_HANDLER_P(object, unset_property)(object, &tmp, NULL); \
- zval_ptr_dtor(&tmp); \
+ zend_unset_property(i_get_exception_base(object), object, ZEND_STR_PREVIOUS, sizeof(ZEND_STR_PREVIOUS)-1); \
}
ZEND_METHOD(exception, __wakeup)
@@ -323,6 +320,12 @@ ZEND_METHOD(exception, __wakeup)
CHECK_EXC_TYPE(ZEND_STR_LINE, IS_LONG);
CHECK_EXC_TYPE(ZEND_STR_TRACE, IS_ARRAY);
CHECK_EXC_TYPE(ZEND_STR_PREVIOUS, IS_OBJECT);
+ pvalue = zend_read_property(i_get_exception_base(object), object, ZEND_STR_PREVIOUS, sizeof(ZEND_STR_PREVIOUS)-1, 1, &value);
+ if (pvalue && Z_TYPE_P(pvalue) != IS_NULL && (Z_TYPE_P(pvalue) != IS_OBJECT ||
+ !instanceof_function(Z_OBJCE_P(pvalue), i_get_exception_base(object)) ||
+ pvalue == object)) {
+ zend_unset_property(i_get_exception_base(object), object, ZEND_STR_PREVIOUS, sizeof(ZEND_STR_PREVIOUS)-1);
+ }
}
/* }}} */
@@ -735,10 +738,24 @@ ZEND_METHOD(exception, __toString)
zend_string_release(file);
zval_ptr_dtor(&trace);
+ Z_OBJPROP_P(exception)->u.v.nApplyCount++;
exception = GET_PROPERTY(exception, ZEND_STR_PREVIOUS);
+ if (exception && Z_TYPE_P(exception) == IS_OBJECT && Z_OBJPROP_P(exception)->u.v.nApplyCount > 0) {
+ exception = NULL;
+ }
}
zend_string_release(fname);
+ /* Reset apply counts */
+ while (exception && Z_TYPE_P(exception) == IS_OBJECT && (base_ce = i_get_exception_base(exception)) && instanceof_function(Z_OBJCE_P(exception), base_ce)) {
+ if(Z_OBJPROP_P(exception)->u.v.nApplyCount) {
+ Z_OBJPROP_P(exception)->u.v.nApplyCount--;
+ } else {
+ break;
+ }
+ exception = GET_PROPERTY(exception, ZEND_STR_PREVIOUS);
+ }
+
exception = getThis();
base_ce = i_get_exception_base(exception);