From b1baa738ddf58b02793ba140f2404d01394fa687 Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Fri, 11 Nov 2022 12:43:11 +0000 Subject: [PATCH] Fix OOME handing in `CreateAnnotationMember()`. Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Change-Id: I63ba3eae20460156db9a8046f2fdbeb81419c4a0 --- runtime/dex/dex_file_annotations.cc | 43 +++++++++++++++++++---------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/runtime/dex/dex_file_annotations.cc b/runtime/dex/dex_file_annotations.cc index bf42529bc0..f2ee9a677e 100644 --- a/runtime/dex/dex_file_annotations.cc +++ b/runtime/dex/dex_file_annotations.cc @@ -700,8 +700,6 @@ ObjPtr CreateAnnotationMember(const ClassData& klass, StackHandleScope<5> hs(self); uint32_t element_name_index = DecodeUnsignedLeb128(annotation); const char* name = dex_file.StringDataByIdx(dex::StringIndex(element_name_index)); - Handle string_name( - hs.NewHandle(mirror::String::AllocFromModifiedUtf8(self, name))); PointerSize pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize(); ArtMethod* annotation_method = @@ -709,7 +707,19 @@ ObjPtr CreateAnnotationMember(const ClassData& klass, if (annotation_method == nullptr) { return nullptr; } - Handle method_return(hs.NewHandle(annotation_method->ResolveReturnType())); + + Handle string_name = + hs.NewHandle(mirror::String::AllocFromModifiedUtf8(self, name)); + if (UNLIKELY(string_name == nullptr)) { + LOG(ERROR) << "Failed to allocate name for annotation member"; + return nullptr; + } + + Handle method_return = hs.NewHandle(annotation_method->ResolveReturnType()); + if (UNLIKELY(method_return == nullptr)) { + LOG(ERROR) << "Failed to resolve method return type for annotation member"; + return nullptr; + } DexFile::AnnotationValue annotation_value; if (!ProcessAnnotationValue(klass, @@ -717,23 +727,26 @@ ObjPtr CreateAnnotationMember(const ClassData& klass, &annotation_value, method_return, DexFile::kAllObjects)) { + // TODO: Logging the error breaks run-test 005-annotations. + // LOG(ERROR) << "Failed to process annotation value for annotation member"; return nullptr; } - Handle value_object(hs.NewHandle(annotation_value.value_.GetL())); + Handle value_object = hs.NewHandle(annotation_value.value_.GetL()); - ArtMethod* annotation_member_init = WellKnownClasses::libcore_reflect_AnnotationMember_init; - ObjPtr annotation_member_class = annotation_member_init->GetDeclaringClass(); - DCHECK(annotation_member_class->IsInitialized()); - Handle new_member(hs.NewHandle(annotation_member_class->AllocObject(self))); - ObjPtr method_obj_ptr = (pointer_size == PointerSize::k64) + Handle method_object = hs.NewHandle((pointer_size == PointerSize::k64) ? mirror::Method::CreateFromArtMethod(self, annotation_method) - : mirror::Method::CreateFromArtMethod(self, annotation_method); - Handle method_object(hs.NewHandle(method_obj_ptr)); + : mirror::Method::CreateFromArtMethod(self, annotation_method)); + if (UNLIKELY(method_object == nullptr)) { + LOG(ERROR) << "Failed to create method object for annotation member"; + return nullptr; + } - if (new_member == nullptr || string_name == nullptr || - method_object == nullptr || method_return == nullptr) { - LOG(ERROR) << StringPrintf("Failed creating annotation element (m=%p n=%p a=%p r=%p", - new_member.Get(), string_name.Get(), method_object.Get(), method_return.Get()); + ArtMethod* annotation_member_init = WellKnownClasses::libcore_reflect_AnnotationMember_init; + DCHECK(annotation_member_init->GetDeclaringClass()->IsInitialized()); + Handle new_member = + hs.NewHandle(annotation_member_init->GetDeclaringClass()->AllocObject(self)); + if (new_member == nullptr) { + LOG(ERROR) << "Failed to allocate annotation member"; return nullptr; }