summaryrefslogtreecommitdiff
path: root/malloc.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2016-12-07 10:22:09 +0300
committerIvan Maidanski <ivmai@mail.ru>2016-12-07 10:22:09 +0300
commit18985f65b411b9fee8f69f6608f07de7f27ee6c9 (patch)
tree23e36f42017e47c33596dc88087d494d6ae0809e /malloc.c
parent8d43b72f2a690c77bdb376c461ee1c6360710745 (diff)
downloadbdwgc-18985f65b411b9fee8f69f6608f07de7f27ee6c9.tar.gz
Fix '32-bit value shift followed by expansion to 64-bit' code defect
* gcj_mlc.c [GC_GCJ_SUPPORT] (GC_core_gcj_malloc, GC_gcj_malloc_ignore_off_page): Cast lg local variable to word before passing it to GRANULES_TO_BYTES (so that value type widening does not occur after the value left shift). * malloc.c (GC_generic_malloc_inner, GC_malloc_kind_global, GC_generic_malloc_uncollectable): Likewise. * typd_mlc.c (GC_malloc_explicitly_typed_ignore_off_page): Likewise. * misc.c (block_add_size): Cast hhdr->hb_sz to word before passing it to WORDS_TO_BYTES; cast HBLKSIZE-1 to word before "~" operation.
Diffstat (limited to 'malloc.c')
-rw-r--r--malloc.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/malloc.c b/malloc.c
index a6e0333e..28b2ac6c 100644
--- a/malloc.c
+++ b/malloc.c
@@ -147,7 +147,7 @@ GC_INNER void * GC_generic_malloc_inner(size_t lb, int k)
}
*opp = obj_link(op);
obj_link(op) = 0;
- GC_bytes_allocd += GRANULES_TO_BYTES(lg);
+ GC_bytes_allocd += GRANULES_TO_BYTES((word)lg);
} else {
op = (ptr_t)GC_alloc_large_and_clear(ADD_SLOP(lb), k, 0);
if (op != NULL)
@@ -266,7 +266,7 @@ GC_API GC_ATTR_MALLOC void * GC_CALL GC_malloc_kind_global(size_t lb, int k)
*opp = obj_link(op);
obj_link(op) = 0;
}
- GC_bytes_allocd += GRANULES_TO_BYTES(lg);
+ GC_bytes_allocd += GRANULES_TO_BYTES((word)lg);
UNLOCK();
return op;
}
@@ -316,11 +316,11 @@ GC_API GC_ATTR_MALLOC void * GC_CALL GC_generic_malloc_uncollectable(
if (EXPECT(op != NULL, TRUE)) {
*opp = obj_link(op);
obj_link(op) = 0;
- GC_bytes_allocd += GRANULES_TO_BYTES(lg);
+ GC_bytes_allocd += GRANULES_TO_BYTES((word)lg);
/* Mark bit was already set on free list. It will be */
/* cleared only temporarily during a collection, as a */
/* result of the normal free list mark bit clearing. */
- GC_non_gc_bytes += GRANULES_TO_BYTES(lg);
+ GC_non_gc_bytes += GRANULES_TO_BYTES((word)lg);
UNLOCK();
} else {
UNLOCK();