diff options
Diffstat (limited to 'runtime/native/dalvik_system_DexFile.cc')
-rw-r--r-- | runtime/native/dalvik_system_DexFile.cc | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/runtime/native/dalvik_system_DexFile.cc b/runtime/native/dalvik_system_DexFile.cc index cd0e55f261..1234933db9 100644 --- a/runtime/native/dalvik_system_DexFile.cc +++ b/runtime/native/dalvik_system_DexFile.cc @@ -188,7 +188,7 @@ static jobject DexFile_openDexFileNative(JNIEnv* env, if (array == nullptr) { ScopedObjectAccess soa(env); for (auto& dex_file : dex_files) { - if (linker->FindDexCache(soa.Self(), *dex_file, true) != nullptr) { + if (linker->IsDexFileRegistered(soa.Self(), *dex_file)) { dex_file.release(); } } @@ -230,7 +230,7 @@ static jboolean DexFile_closeDexFile(JNIEnv* env, jclass, jobject cookie) { if (dex_file != nullptr) { // Only delete the dex file if the dex cache is not found to prevent runtime crashes if there // are calls to DexFile.close while the ART DexFile is still in use. - if (class_linker->FindDexCache(soa.Self(), *dex_file, true) == nullptr) { + if (!class_linker->IsDexFileRegistered(soa.Self(), *dex_file)) { // Clear the element in the array so that we can call close again. long_dex_files->Set(i, 0); delete dex_file; @@ -281,7 +281,13 @@ static jclass DexFile_defineClassNative(JNIEnv* env, StackHandleScope<1> hs(soa.Self()); Handle<mirror::ClassLoader> class_loader( hs.NewHandle(soa.Decode<mirror::ClassLoader>(javaLoader))); - class_linker->RegisterDexFile(*dex_file, class_loader.Get()); + ObjPtr<mirror::DexCache> dex_cache = + class_linker->RegisterDexFile(*dex_file, class_loader.Get()); + if (dex_cache == nullptr) { + // OOME or InternalError (dexFile already registered with a different class loader). + soa.Self()->AssertPendingException(); + return nullptr; + } ObjPtr<mirror::Class> result = class_linker->DefineClass(soa.Self(), descriptor.c_str(), hash, |