Skip to content

Commit 92d3350

Browse files
author
Ivan Walulya
committed
8331920: ubsan: g1CardSetContainers.inline.hpp:266:5: runtime error: index 2 out of bounds for type 'G1CardSetHowl::ContainerPtr [2]' reported
Reviewed-by: tschatzl, aboldtch
1 parent 4f1a10f commit 92d3350

File tree

3 files changed

+34
-12
lines changed

3 files changed

+34
-12
lines changed

src/hotspot/share/gc/g1/g1CardSet.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,7 @@ G1AddCardResult G1CardSet::add_to_howl(ContainerPtr parent_container,
533533
ContainerPtr container;
534534

535535
uint bucket = _config->howl_bucket_index(card_in_region);
536-
ContainerPtr volatile* bucket_entry = howl->get_container_addr(bucket);
536+
ContainerPtr volatile* bucket_entry = howl->container_addr(bucket);
537537

538538
while (true) {
539539
if (Atomic::load(&howl->_num_entries) >= _config->cards_in_howl_threshold()) {

src/hotspot/share/gc/g1/g1CardSetContainers.hpp

+10-6
Original file line numberDiff line numberDiff line change
@@ -238,23 +238,27 @@ class G1CardSetHowl : public G1CardSetContainer {
238238
using ContainerPtr = G1CardSet::ContainerPtr;
239239
EntryCountType volatile _num_entries;
240240
private:
241-
ContainerPtr _buckets[2];
242-
// Do not add class member variables beyond this point
241+
// VLA implementation.
242+
ContainerPtr _buckets[1];
243+
// Do not add class member variables beyond this point.
243244

244245
// Iterates over the given ContainerPtr with at index in this Howl card set,
245246
// applying a CardOrRangeVisitor on it.
246247
template <class CardOrRangeVisitor>
247248
void iterate_cardset(ContainerPtr const container, uint index, CardOrRangeVisitor& found, G1CardSetConfiguration* config);
248249

250+
ContainerPtr at(EntryCountType index) const;
251+
252+
ContainerPtr const* buckets() const;
253+
249254
public:
250255
G1CardSetHowl(EntryCountType card_in_region, G1CardSetConfiguration* config);
251256

252-
ContainerPtr* get_container_addr(EntryCountType index) {
253-
return &_buckets[index];
254-
}
257+
ContainerPtr const* container_addr(EntryCountType index) const;
255258

256-
bool contains(uint card_idx, G1CardSetConfiguration* config);
259+
ContainerPtr* container_addr(EntryCountType index);
257260

261+
bool contains(uint card_idx, G1CardSetConfiguration* config);
258262
// Iterates over all ContainerPtrs in this Howl card set, applying a CardOrRangeVisitor
259263
// on it.
260264
template <class CardOrRangeVisitor>

src/hotspot/share/gc/g1/g1CardSetContainers.inline.hpp

+23-5
Original file line numberDiff line numberDiff line change
@@ -257,23 +257,41 @@ inline size_t G1CardSetBitMap::header_size_in_bytes() {
257257
return offset_of(G1CardSetBitMap, _bits);
258258
}
259259

260+
inline G1CardSetHowl::ContainerPtr const* G1CardSetHowl::container_addr(EntryCountType index) const {
261+
assert(index < _num_entries, "precondition");
262+
return buckets() + index;
263+
}
264+
265+
inline G1CardSetHowl::ContainerPtr* G1CardSetHowl::container_addr(EntryCountType index) {
266+
return const_cast<ContainerPtr*>(const_cast<const G1CardSetHowl*>(this)->container_addr(index));
267+
}
268+
269+
inline G1CardSetHowl::ContainerPtr G1CardSetHowl::at(EntryCountType index) const {
270+
return *container_addr(index);
271+
}
272+
273+
inline G1CardSetHowl::ContainerPtr const* G1CardSetHowl::buckets() const {
274+
const void* ptr = reinterpret_cast<const char*>(this) + header_size_in_bytes();
275+
return reinterpret_cast<ContainerPtr const*>(ptr);
276+
}
277+
260278
inline G1CardSetHowl::G1CardSetHowl(EntryCountType card_in_region, G1CardSetConfiguration* config) :
261279
G1CardSetContainer(),
262280
_num_entries((config->max_cards_in_array() + 1)) /* Card Transfer will not increment _num_entries */ {
263281
EntryCountType num_buckets = config->num_buckets_in_howl();
264282
EntryCountType bucket = config->howl_bucket_index(card_in_region);
265283
for (uint i = 0; i < num_buckets; ++i) {
266-
_buckets[i] = G1CardSetInlinePtr();
284+
*container_addr(i) = G1CardSetInlinePtr();
267285
if (i == bucket) {
268-
G1CardSetInlinePtr value(&_buckets[i], _buckets[i]);
286+
G1CardSetInlinePtr value(container_addr(i), at(i));
269287
value.add(card_in_region, config->inline_ptr_bits_per_card(), config->max_cards_in_inline_ptr());
270288
}
271289
}
272290
}
273291

274292
inline bool G1CardSetHowl::contains(uint card_idx, G1CardSetConfiguration* config) {
275293
EntryCountType bucket = config->howl_bucket_index(card_idx);
276-
ContainerPtr* array_entry = get_container_addr(bucket);
294+
ContainerPtr* array_entry = container_addr(bucket);
277295
ContainerPtr container = Atomic::load_acquire(array_entry);
278296

279297
switch (G1CardSet::container_type(container)) {
@@ -299,14 +317,14 @@ inline bool G1CardSetHowl::contains(uint card_idx, G1CardSetConfiguration* confi
299317
template <class CardOrRangeVisitor>
300318
inline void G1CardSetHowl::iterate(CardOrRangeVisitor& found, G1CardSetConfiguration* config) {
301319
for (uint i = 0; i < config->num_buckets_in_howl(); ++i) {
302-
iterate_cardset(_buckets[i], i, found, config);
320+
iterate_cardset(at(i), i, found, config);
303321
}
304322
}
305323

306324
template <class ContainerPtrVisitor>
307325
inline void G1CardSetHowl::iterate(ContainerPtrVisitor& found, uint num_card_sets) {
308326
for (uint i = 0; i < num_card_sets; ++i) {
309-
found(&_buckets[i]);
327+
found(container_addr(i));
310328
}
311329
}
312330

0 commit comments

Comments
 (0)