summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2019-08-09 13:40:56 +0300
committerDmitry Stogov <dmitry@zend.com>2019-08-09 13:40:56 +0300
commit9b973550b90101577b1ee8d027b5b689fff0e81f (patch)
tree62909177bae1e76efba5c3773ee4eef40179b244
parent3b84238200fb53ae16a24865ec6b3ffaeb5c3bd8 (diff)
parentb2044cd93eb32ea44c4283e56b87ca71a8e81306 (diff)
downloadphp-git-9b973550b90101577b1ee8d027b5b689fff0e81f.tar.gz
Merge branch 'PHP-7.4'
* PHP-7.4: Added asserts to catch GC errors when refcount goes below zero.
-rw-r--r--Zend/zend_gc.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c
index f01ea6e2c5..7a997a485d 100644
--- a/Zend/zend_gc.c
+++ b/Zend/zend_gc.c
@@ -823,6 +823,7 @@ static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack)
while (zv != end) {
if (Z_REFCOUNTED_P(zv)) {
ref = Z_COUNTED_P(zv);
+ ZEND_ASSERT(GC_REFCOUNT(ref) > 0);
GC_DELREF(ref);
if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) {
GC_REF_SET_COLOR(ref, GC_GREY);
@@ -833,6 +834,7 @@ static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack)
}
if (EXPECTED(!ht)) {
ref = Z_COUNTED_P(zv);
+ ZEND_ASSERT(GC_REFCOUNT(ref) > 0);
GC_DELREF(ref);
if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) {
GC_REF_SET_COLOR(ref, GC_GREY);
@@ -853,6 +855,7 @@ static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack)
} else if (GC_TYPE(ref) == IS_REFERENCE) {
if (Z_REFCOUNTED(((zend_reference*)ref)->val)) {
ref = Z_COUNTED(((zend_reference*)ref)->val);
+ ZEND_ASSERT(GC_REFCOUNT(ref) > 0);
GC_DELREF(ref);
if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) {
GC_REF_SET_COLOR(ref, GC_GREY);
@@ -885,6 +888,7 @@ static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack)
}
if (Z_REFCOUNTED_P(zv)) {
ref = Z_COUNTED_P(zv);
+ ZEND_ASSERT(GC_REFCOUNT(ref) > 0);
GC_DELREF(ref);
if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) {
GC_REF_SET_COLOR(ref, GC_GREY);
@@ -898,6 +902,7 @@ static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack)
zv = Z_INDIRECT_P(zv);
}
ref = Z_COUNTED_P(zv);
+ ZEND_ASSERT(GC_REFCOUNT(ref) > 0);
GC_DELREF(ref);
if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) {
GC_REF_SET_COLOR(ref, GC_GREY);