Call `GetArena()` instead of accessing `arena_` directly in `RepeatedPtrFieldBase`. PiperOrigin-RevId: 805963204
diff --git a/src/google/protobuf/repeated_ptr_field.cc b/src/google/protobuf/repeated_ptr_field.cc index 57fd3f5..34fe860 100644 --- a/src/google/protobuf/repeated_ptr_field.cc +++ b/src/google/protobuf/repeated_ptr_field.cc
@@ -143,7 +143,8 @@ for (; src < end_assign; ++dst, ++src) { (*dst)->assign(**src); } - if (Arena* const arena = arena_) { + Arena* const arena = GetArena(); + if (arena != nullptr) { for (; src < end; ++dst, ++src) { *dst = Arena::Create<std::string>(arena, **src); }
diff --git a/src/google/protobuf/repeated_ptr_field.h b/src/google/protobuf/repeated_ptr_field.h index b34959d..cd58358 100644 --- a/src/google/protobuf/repeated_ptr_field.h +++ b/src/google/protobuf/repeated_ptr_field.h
@@ -168,9 +168,11 @@ ~RepeatedPtrFieldBase() { #ifndef NDEBUG - // Try to trigger segfault / asan failure in non-opt builds if arena_ - // lifetime has ended before the destructor. - if (arena_) (void)arena_->SpaceAllocated(); + // Try to trigger segfault / asan failure in non-opt builds if the arena + // lifetime has ended before the destructor. Note that `GetArena()` is + // not free, but this is debug-only. + const Arena* arena = GetArena(); + if (arena != nullptr) (void)arena->SpaceAllocated(); #endif } @@ -228,7 +230,7 @@ // TODO: arena check is redundant once all `RepeatedPtrField`s // with non-null arena are owned by the arena. - if (ABSL_PREDICT_FALSE(arena_ != nullptr)) return; + if (ABSL_PREDICT_FALSE(GetArena() != nullptr)) return; using H = CommonHandler<TypeHandler>; int n = allocated_size(); @@ -481,7 +483,7 @@ // this case because otherwise a loop calling AddAllocated() followed by // Clear() would leak memory. using H = CommonHandler<TypeHandler>; - Delete<H>(element_at(current_size_), arena_); + Delete<H>(element_at(current_size_), GetArena()); } else if (current_size_ < allocated_size()) { // We have some cleared objects. We don't care about their order, so we // can just move the first one to the end to make space.