Fix null dereference in reclaim_block if DONT_ADD_BYTE_AT_END
authorHamayama <hamay1010@gmail.com>
Tue, 20 Jun 2017 08:56:20 +0000 (11:56 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Tue, 20 Jun 2017 08:56:20 +0000 (11:56 +0300)
Issue #167 (bdwgc).

* reclaim.c (GC_reclaim_block): If ok->ok_reclaim_list is null then
do not update hhdr->hb_next (and *rlh).

reclaim.c

index 1b26e92..d307005 100644 (file)
--- a/reclaim.c
+++ b/reclaim.c
@@ -438,10 +438,13 @@ STATIC void GC_reclaim_block(struct hblk *hbp, word report_if_found)
           }
         } else if (GC_find_leak || !GC_block_nearly_full(hhdr)) {
           /* group of smaller objects, enqueue the real work */
-          struct hblk **rlh = ok -> ok_reclaim_list + BYTES_TO_GRANULES(sz);
+          struct hblk **rlh = ok -> ok_reclaim_list;
 
-          hhdr -> hb_next = *rlh;
-          *rlh = hbp;
+          if (rlh != NULL) {
+            rlh += BYTES_TO_GRANULES(sz);
+            hhdr -> hb_next = *rlh;
+            *rlh = hbp;
+          }
         } /* else not worth salvaging. */
         /* We used to do the nearly_full check later, but we    */
         /* already have the right cache context here.  Also     */