]> granicus.if.org Git - gc/commitdiff
Workaround 'null pointer dereference' false positive in push_next_marked
authorIvan Maidanski <ivmai@mail.ru>
Sat, 17 Dec 2016 06:47:10 +0000 (09:47 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Sat, 17 Dec 2016 06:47:10 +0000 (09:47 +0300)
* mark.c [LINT2] (GC_push_next_marked,
GC_push_next_marked_uncollectable): Call ABORT if h is null (to ensure
that null is not passed to GC_push_marked).
* mark.c [!GC_DISABLE_INCREMENTAL && LINT2] (GC_push_next_marked_dirty):
Likewise.
* mark.c [!GC_DISABLE_INCREMENTAL && STUBBORN_ALLOC]
(GC_push_next_marked_dirty): Remove code duplication.

mark.c

diff --git a/mark.c b/mark.c
index bdcec3bee4da31e8d0894bf947cbf33bd309ecf8..6db0bb0118e6d053ca8a69038fe3939fd4774874 100644 (file)
--- a/mark.c
+++ b/mark.c
@@ -1915,6 +1915,10 @@ STATIC struct hblk * GC_push_next_marked(struct hblk *h)
       h = GC_next_used_block(h);
       if (h == 0) return(0);
       hhdr = GC_find_header((ptr_t)h);
+    } else {
+#     ifdef LINT2
+        if (NULL == h) ABORT("Bad HDR() definition");
+#     endif
     }
     GC_push_marked(h, hhdr);
     return(h + OBJ_SZ_TO_BLOCKS(hhdr -> hb_sz));
@@ -1933,18 +1937,20 @@ STATIC struct hblk * GC_push_next_marked(struct hblk *h)
           h = GC_next_used_block(h);
           if (h == 0) return(0);
           hhdr = GC_find_header((ptr_t)h);
+        } else {
+#         ifdef LINT2
+            if (NULL == h) ABORT("Bad HDR() definition");
+#         endif
         }
 #       ifdef STUBBORN_ALLOC
           if (hhdr -> hb_obj_kind == STUBBORN) {
-            if (GC_page_was_changed(h) && GC_block_was_dirty(h, hhdr)) {
+            if (GC_page_was_changed(h) && GC_block_was_dirty(h, hhdr))
                 break;
-            }
-          } else {
-            if (GC_block_was_dirty(h, hhdr)) break;
-          }
-#       else
-          if (GC_block_was_dirty(h, hhdr)) break;
+          } else
 #       endif
+        /* else */ {
+          if (GC_block_was_dirty(h, hhdr)) break;
+        }
         h += OBJ_SZ_TO_BLOCKS(hhdr -> hb_sz);
         hhdr = HDR(h);
     }
@@ -1965,6 +1971,10 @@ STATIC struct hblk * GC_push_next_marked_uncollectable(struct hblk *h)
           h = GC_next_used_block(h);
           if (h == 0) return(0);
           hhdr = GC_find_header((ptr_t)h);
+        } else {
+#         ifdef LINT2
+            if (NULL == h) ABORT("Bad HDR() definition");
+#         endif
         }
         if (hhdr -> hb_obj_kind == UNCOLLECTABLE) {
             GC_push_marked(h, hhdr);