diff options
author | 2021-09-13 09:20:33 +0100 | |
---|---|---|
committer | 2021-09-13 10:47:54 +0000 | |
commit | c07f48875c60d88205283c979898ce31df2a2026 (patch) | |
tree | d161f50a0b964468879ca14e4601fd1f6c029ae0 /runtime/class_linker-inl.h | |
parent | 7fae86c62a9ffeb94a7c11f1660c94873368dcec (diff) |
Add a test and consistency checks in method / field resolution.
Always use the associated class loader of a dex cache.
Test: test.py
Bug: 199246839
Change-Id: Ib512126915cac4af229a5a206a8b4d9d73bdf02a
Diffstat (limited to 'runtime/class_linker-inl.h')
-rw-r--r-- | runtime/class_linker-inl.h | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/runtime/class_linker-inl.h b/runtime/class_linker-inl.h index c45f001aa3..13191016b2 100644 --- a/runtime/class_linker-inl.h +++ b/runtime/class_linker-inl.h @@ -164,6 +164,7 @@ inline ObjPtr<mirror::Class> ClassLinker::ResolveType(dex::TypeIndex type_idx, Handle<mirror::DexCache> dex_cache, Handle<mirror::ClassLoader> class_loader) { DCHECK(dex_cache != nullptr); + DCHECK(dex_cache->GetClassLoader().Ptr() == class_loader.Get()); Thread::PoisonObjectPointersIfDebug(); ObjPtr<mirror::Class> resolved = dex_cache->GetResolvedType(type_idx); if (resolved == nullptr) { @@ -212,6 +213,7 @@ inline ObjPtr<mirror::Class> ClassLinker::LookupResolvedType( dex::TypeIndex type_idx, ObjPtr<mirror::DexCache> dex_cache, ObjPtr<mirror::ClassLoader> class_loader) { + DCHECK(dex_cache->GetClassLoader().Ptr() == class_loader.Ptr()); ObjPtr<mirror::Class> type = dex_cache->GetResolvedType(type_idx); if (type == nullptr) { type = DoLookupResolvedType(type_idx, dex_cache, class_loader); @@ -273,6 +275,7 @@ inline bool ClassLinker::CheckInvokeClassMismatch(ObjPtr<mirror::DexCache> dex_c InvokeType type, uint32_t method_idx, ObjPtr<mirror::ClassLoader> class_loader) { + DCHECK(dex_cache->GetClassLoader().Ptr() == class_loader.Ptr()); return CheckInvokeClassMismatch<kThrow>( dex_cache, type, @@ -288,6 +291,7 @@ inline bool ClassLinker::CheckInvokeClassMismatch(ObjPtr<mirror::DexCache> dex_c inline ArtMethod* ClassLinker::LookupResolvedMethod(uint32_t method_idx, ObjPtr<mirror::DexCache> dex_cache, ObjPtr<mirror::ClassLoader> class_loader) { + DCHECK(dex_cache->GetClassLoader().Ptr() == class_loader.Ptr()); ArtMethod* resolved = dex_cache->GetResolvedMethod(method_idx); if (resolved == nullptr) { const DexFile& dex_file = *dex_cache->GetDexFile(); @@ -433,6 +437,7 @@ inline ArtField* ClassLinker::LookupResolvedField(uint32_t field_idx, ArtField* field = referrer->GetDexCache<kWithoutReadBarrier>()->GetResolvedField( field_idx); if (field == nullptr) { + referrer = referrer->GetInterfaceMethodIfProxy(image_pointer_size_); ObjPtr<mirror::ClassLoader> class_loader = referrer->GetDeclaringClass()->GetClassLoader(); field = LookupResolvedField(field_idx, referrer->GetDexCache(), class_loader, is_static); } @@ -449,6 +454,7 @@ inline ArtField* ClassLinker::ResolveField(uint32_t field_idx, field_idx); if (UNLIKELY(resolved_field == nullptr)) { StackHandleScope<2> hs(Thread::Current()); + referrer = referrer->GetInterfaceMethodIfProxy(image_pointer_size_); ObjPtr<mirror::Class> referring_class = referrer->GetDeclaringClass(); Handle<mirror::DexCache> dex_cache(hs.NewHandle(referrer->GetDexCache())); Handle<mirror::ClassLoader> class_loader(hs.NewHandle(referring_class->GetClassLoader())); |