]> granicus.if.org Git - php/commitdiff
Generalize delref assertion
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 13 Aug 2019 09:44:54 +0000 (11:44 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 13 Aug 2019 09:44:54 +0000 (11:44 +0200)
The refcount should never become negative, not just during GC.

Zend/zend_gc.c
Zend/zend_types.h

index 4dd0ed14c7f3fee179dbb0ba39f04332409b5cce..7ff1412ad698d29cd16370c265e0fb6a6a4ec23b 100644 (file)
@@ -833,7 +833,6 @@ 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);
@@ -844,7 +843,6 @@ 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);
@@ -865,7 +863,6 @@ 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);
@@ -898,7 +895,6 @@ 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);
@@ -912,7 +908,6 @@ 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);
index a018c43b81325e96d0d1564f4da061a3c839b460..83877e0d5d4a95fa6cc6c7c718d5c839a4b9b393 100644 (file)
@@ -1032,6 +1032,7 @@ static zend_always_inline uint32_t zend_gc_addref(zend_refcounted_h *p) {
 }
 
 static zend_always_inline uint32_t zend_gc_delref(zend_refcounted_h *p) {
+       ZEND_ASSERT(p->refcount > 0);
        ZEND_RC_MOD_CHECK(p);
        return --(p->refcount);
 }