com php-src: More accurate zval comparison: Zend/zend_API.c
| From: | Dmitry Stogov | Date: | Wed, 19 Mar 2014 18:43:36 +0000 |
| Subject: | com php-src: More accurate zval comparison: Zend/zend_API.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-77595@lists.php.net to get a copy of this message | ||
Commit: acc719766d5bd0dfcceaa310289654f98d020c91
Author: Dmitry Stogov <dmitry@zend.com> Wed, 19 Mar 2014 22:43:36 +0400
Parents: e884d5d8e34a4349c2a3243832cf3379deed3cae
Branches: phpng
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=acc719766d5bd0dfcceaa310289654f98d020c91
Log:
More accurate zval comparison
Changed paths:
M Zend/zend_API.c
Diff:
diff --git a/Zend/zend_API..c b/Zend/zend_API.c
index a9c10b6..e9d3081 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -3931,12 +3931,37 @@ ZEND_API void zend_replace_error_handling(zend_error_handling_t
error_handling,
}
/* }}} */
+static int same_zval(zval *zv1, zval *zv2) /* {{{ */
+{
+ if (Z_TYPE_P(zv1) != Z_TYPE_P(zv2)) {
+ return 0;
+ }
+ switch (Z_TYPE_P(zv1)) {
+ case IS_UNDEF:
+ case IS_NULL:
+ return 1;
+ case IS_BOOL:
+ case IS_LONG:
+ return Z_LVAL_P(zv1) == Z_LVAL_P(zv2);
+ case IS_DOUBLE:
+ return Z_LVAL_P(zv1) == Z_LVAL_P(zv2);
+ case IS_STRING:
+ case IS_ARRAY:
+ case IS_OBJECT:
+ case IS_RESOURCE:
+ return Z_COUNTED_P(zv1) == Z_COUNTED_P(zv2);
+ default:
+ return 0;
+ }
+}
+/* }}} */
+
ZEND_API void zend_restore_error_handling(zend_error_handling *saved TSRMLS_DC) /* {{{ */
{
EG(error_handling) = saved->handling;
EG(exception_class) = saved->handling == EH_THROW ? saved->exception : NULL;
if (Z_TYPE(saved->user_handler) != IS_UNDEF
- && memcmp(&saved->user_handler, &EG(user_error_handler), sizeof(zval)) != 0) {
+ && !same_zval(&saved->user_handler, &EG(user_error_handler))) {
zval_ptr_dtor(&EG(user_error_handler));
ZVAL_COPY_VALUE(&EG(user_error_handler), &saved->user_handler);
} else if (Z_TYPE(saved->user_handler)) {