Skip to content

Commit 999c134

Browse files
committed
8264417: ParallelCompactData::region_offset should not accept pointers outside the current region
Reviewed-by: tschatzl, iwalulya
1 parent 604b14c commit 999c134

File tree

2 files changed

+7
-6
lines changed

2 files changed

+7
-6
lines changed

src/hotspot/share/gc/parallel/psParallelCompact.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,7 @@ void ParallelCompactData::add_obj(HeapWord* addr, size_t len)
534534
{
535535
const size_t obj_ofs = pointer_delta(addr, _region_start);
536536
const size_t beg_region = obj_ofs >> Log2RegionSize;
537+
// end_region is inclusive
537538
const size_t end_region = (obj_ofs + len - 1) >> Log2RegionSize;
538539

539540
DEBUG_ONLY(Atomic::inc(&add_obj_count);)
@@ -549,7 +550,6 @@ void ParallelCompactData::add_obj(HeapWord* addr, size_t len)
549550
const size_t beg_ofs = region_offset(addr);
550551
_region_data[beg_region].add_live_obj(RegionSize - beg_ofs);
551552

552-
Klass* klass = cast_to_oop(addr)->klass();
553553
// Middle regions--completely spanned by this object.
554554
for (size_t region = beg_region + 1; region < end_region; ++region) {
555555
_region_data[region].set_partial_obj_size(RegionSize);
@@ -565,8 +565,8 @@ void ParallelCompactData::add_obj(HeapWord* addr, size_t len)
565565
void
566566
ParallelCompactData::summarize_dense_prefix(HeapWord* beg, HeapWord* end)
567567
{
568-
assert(region_offset(beg) == 0, "not RegionSize aligned");
569-
assert(region_offset(end) == 0, "not RegionSize aligned");
568+
assert(is_region_aligned(beg), "not RegionSize aligned");
569+
assert(is_region_aligned(end), "not RegionSize aligned");
570570

571571
size_t cur_region = addr_to_region_idx(beg);
572572
const size_t end_region = addr_to_region_idx(end);
@@ -762,7 +762,7 @@ bool ParallelCompactData::summarize(SplitInfo& split_info,
762762
destination_count += 1;
763763
// Data from cur_region will be copied to the start of dest_region_2.
764764
_region_data[dest_region_2].set_source_region(cur_region);
765-
} else if (region_offset(dest_addr) == 0) {
765+
} else if (is_region_aligned(dest_addr)) {
766766
// Data from cur_region will be copied to the start of the destination
767767
// region.
768768
_region_data[dest_region_1].set_source_region(cur_region);

src/hotspot/share/gc/parallel/psParallelCompact.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -675,7 +675,8 @@ inline size_t
675675
ParallelCompactData::region_offset(const HeapWord* addr) const
676676
{
677677
assert(addr >= _region_start, "bad addr");
678-
assert(addr <= _region_end, "bad addr");
678+
// would mistakenly return 0 for _region_end
679+
assert(addr < _region_end, "bad addr");
679680
return (size_t(addr) & RegionAddrOffsetMask) >> LogHeapWordSize;
680681
}
681682

@@ -734,7 +735,7 @@ ParallelCompactData::region_align_up(HeapWord* addr) const
734735
inline bool
735736
ParallelCompactData::is_region_aligned(HeapWord* addr) const
736737
{
737-
return region_offset(addr) == 0;
738+
return (size_t(addr) & RegionAddrOffsetMask) == 0;
738739
}
739740

740741
inline size_t

0 commit comments

Comments
 (0)