com php-src: Merge branch 'PHP-7.0' into PHP-7.1: Zend/zend_e xceptions.c
| From: | Anatol Belski | Date: | Wed, 12 Oct 2016 18:09:24 +0000 |
| Subject: | com php-src: Merge branch 'PHP-7.0' into PHP-7.1: Zend/zend_e xceptions.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-94960@lists.php.net to get a copy of this message | ||
Commit: af1bf873fe4fc70be17fa9f270e8f30666f2d2db
Author: Anatol Belski <ab@php.net> Wed, 12 Oct 2016 20:09:24 +0200
Parents: fa9370db03944b31a9c3b20d586a290fe51ceaa0 74b5662536ccdf9b7b02c495f02a27c64e27fff7
Branches: PHP-7.1
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=af1bf873fe4fc70be17fa9f270e8f30666f2d2db
Log:
Merge branch 'PHP-7.0' into PHP-7.1
* PHP-7.0:
Fix bug #73190: memcpy negative parameter _bc_new_num_ex
Bugs:
https://bugs.php.net/73190
Changed paths:
MM Zend/zend_exceptions.c
Diff:
diff --cc Zend/zend_exceptions.c
index dc073de,89c94eb..4f156c0
--- a/Zend/zend_exceptions.c
+++ b/Zend/zend_exceptions.c
@@@ -303,26 -290,28 +303,29 @@@ ZEND_METHOD(exception, __construct
/* {{{ proto Exception::__wakeup()
Exception unserialize checks */
-#define CHECK_EXC_TYPE(name, type) \
- pvalue = zend_read_property(i_get_exception_base(object), (object), name, sizeof(name) - 1, 1,
&value); \
+#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, name, sizeof(name)-1); \
++ zend_unset_property(i_get_exception_base(object), object, ZEND_STR_PREVIOUS,
sizeof(ZEND_STR_PREVIOUS)-1); \
}
ZEND_METHOD(exception, __wakeup)
{
zval value, *pvalue;
zval *object = getThis();
- CHECK_EXC_TYPE("message", IS_STRING);
- CHECK_EXC_TYPE("string", IS_STRING);
- CHECK_EXC_TYPE("code", IS_LONG);
- CHECK_EXC_TYPE("file", IS_STRING);
- CHECK_EXC_TYPE("line", IS_LONG);
- CHECK_EXC_TYPE("trace", IS_ARRAY);
- pvalue = zend_read_property(i_get_exception_base(object), object, "previous",
sizeof("previous")-1, 1, &value);
+ CHECK_EXC_TYPE(ZEND_STR_MESSAGE, IS_STRING);
+ CHECK_EXC_TYPE(ZEND_STR_STRING, IS_STRING);
+ CHECK_EXC_TYPE(ZEND_STR_CODE, IS_LONG);
+ CHECK_EXC_TYPE(ZEND_STR_FILE, IS_STRING);
+ 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, "previous",
sizeof("previous")-1);
++ zend_unset_property(i_get_exception_base(object), object, ZEND_STR_PREVIOUS,
sizeof(ZEND_STR_PREVIOUS)-1);
+ }
}
/* }}} */
@@@ -735,10 -773,24 +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, "previous");
+ 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;
+ }
}
- zval_dtor(&fname);
+ 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, "previous");
++ exception = GET_PROPERTY(exception, ZEND_STR_PREVIOUS);
+ }
+
exception = getThis();
base_ce = i_get_exception_base(exception);