Remove app image dex file and class loader checks
These checks are already covered by the class loader context.
Test: test-art-host
Change-Id: I8f2a1ab1baa8f09e7a7d4913ff790927eb66cddf
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index ffa772e..d14dd01 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -1347,169 +1347,6 @@
return false;
}
-static bool GetDexFileNames(ScopedObjectAccessUnchecked& soa,
- ObjPtr<mirror::ClassLoader> class_loader,
- /*out*/std::list<ObjPtr<mirror::String>>* dex_files,
- /*out*/std::string* error_msg)
- REQUIRES_SHARED(Locks::mutator_lock_) {
- StackHandleScope<1> hs(soa.Self());
- Handle<mirror::ClassLoader> handle(hs.NewHandle(class_loader));
- // Get element names. Sets error to true on failure.
- auto add_element_names = [&](ObjPtr<mirror::Object> element, bool* error)
- REQUIRES_SHARED(Locks::mutator_lock_) {
- if (element == nullptr) {
- *error_msg = "Null dex element";
- *error = true; // Null element is a critical error.
- return false; // Had an error, stop the visit.
- }
- ObjPtr<mirror::String> name;
- if (!GetDexPathListElementName(element, &name)) {
- *error_msg = "Invalid dex path list element";
- *error = true; // Invalid element, make it a critical error.
- return false; // Stop the visit.
- }
- if (name != nullptr) {
- dex_files->push_front(name);
- }
- return true; // Continue with the next Element.
- };
- bool error = VisitClassLoaderDexElements(soa,
- handle,
- add_element_names,
- /*defaultReturn=*/ false);
- return !error;
-}
-
-static bool CompareClassLoaderTypes(ScopedObjectAccessUnchecked& soa,
- ObjPtr<mirror::ClassLoader> image_class_loader,
- ObjPtr<mirror::ClassLoader> class_loader,
- std::string* error_msg)
- REQUIRES_SHARED(Locks::mutator_lock_) {
- if (ClassLinker::IsBootClassLoader(soa, class_loader)) {
- if (!ClassLinker::IsBootClassLoader(soa, image_class_loader)) {
- *error_msg = "Hierarchies don't match";
- return false;
- }
- } else if (ClassLinker::IsBootClassLoader(soa, image_class_loader)) {
- *error_msg = "Hierarchies don't match";
- return false;
- } else if (class_loader->GetClass() != image_class_loader->GetClass()) {
- *error_msg = StringPrintf("Class loader types don't match %s and %s",
- image_class_loader->PrettyTypeOf().c_str(),
- class_loader->PrettyTypeOf().c_str());
- return false;
- } else if (soa.Decode<mirror::Class>(WellKnownClasses::dalvik_system_PathClassLoader) !=
- class_loader->GetClass()) {
- *error_msg = StringPrintf("Unknown class loader type %s",
- class_loader->PrettyTypeOf().c_str());
- // Unsupported class loader.
- return false;
- }
- return true;
-}
-
-static bool CompareDexFiles(const std::list<ObjPtr<mirror::String>>& image_dex_files,
- const std::list<ObjPtr<mirror::String>>& loader_dex_files,
- std::string* error_msg)
- REQUIRES_SHARED(Locks::mutator_lock_) {
- bool equal = (image_dex_files.size() == loader_dex_files.size()) &&
- std::equal(image_dex_files.begin(),
- image_dex_files.end(),
- loader_dex_files.begin(),
- [](ObjPtr<mirror::String> lhs, ObjPtr<mirror::String> rhs)
- REQUIRES_SHARED(Locks::mutator_lock_) {
- return lhs->Equals(rhs);
- });
- if (!equal) {
- VLOG(image) << "Image dex files " << image_dex_files.size();
- for (ObjPtr<mirror::String> name : image_dex_files) {
- VLOG(image) << name->ToModifiedUtf8();
- }
- VLOG(image) << "Loader dex files " << loader_dex_files.size();
- for (ObjPtr<mirror::String> name : loader_dex_files) {
- VLOG(image) << name->ToModifiedUtf8();
- }
- *error_msg = "Mismatch in dex files";
- }
- return equal;
-}
-
-static bool CompareClassLoaders(ScopedObjectAccessUnchecked& soa,
- ObjPtr<mirror::ClassLoader> image_class_loader,
- ObjPtr<mirror::ClassLoader> class_loader,
- bool check_dex_file_names,
- std::string* error_msg)
- REQUIRES_SHARED(Locks::mutator_lock_) {
- if (!CompareClassLoaderTypes(soa, image_class_loader, class_loader, error_msg)) {
- return false;
- }
-
- if (ClassLinker::IsBootClassLoader(soa, class_loader)) {
- // No need to check further.
- return true;
- }
-
- if (check_dex_file_names) {
- std::list<ObjPtr<mirror::String>> image_dex_files;
- if (!GetDexFileNames(soa, image_class_loader, &image_dex_files, error_msg)) {
- return false;
- }
-
- std::list<ObjPtr<mirror::String>> loader_dex_files;
- if (!GetDexFileNames(soa, class_loader, &loader_dex_files, error_msg)) {
- return false;
- }
-
- if (!CompareDexFiles(image_dex_files, loader_dex_files, error_msg)) {
- return false;
- }
- }
-
- ArtField* field =
- jni::DecodeArtField(WellKnownClasses::dalvik_system_BaseDexClassLoader_sharedLibraryLoaders);
- ObjPtr<mirror::Object> shared_libraries_image_loader = field->GetObject(image_class_loader.Ptr());
- ObjPtr<mirror::Object> shared_libraries_loader = field->GetObject(class_loader.Ptr());
- if (shared_libraries_image_loader == nullptr) {
- if (shared_libraries_loader != nullptr) {
- *error_msg = "Mismatch in shared libraries";
- return false;
- }
- } else if (shared_libraries_loader == nullptr) {
- *error_msg = "Mismatch in shared libraries";
- return false;
- } else {
- ObjPtr<mirror::ObjectArray<mirror::ClassLoader>> array1 =
- shared_libraries_image_loader->AsObjectArray<mirror::ClassLoader>();
- ObjPtr<mirror::ObjectArray<mirror::ClassLoader>> array2 =
- shared_libraries_loader->AsObjectArray<mirror::ClassLoader>();
- if (array1->GetLength() != array2->GetLength()) {
- *error_msg = "Mismatch in number of shared libraries";
- return false;
- }
-
- for (auto clp : ZipLeft(array1->Iterate(), array2->Iterate())) {
- // Do a full comparison of the class loaders, including comparing their dex files.
- if (!CompareClassLoaders(soa,
- clp.first,
- clp.second,
- /*check_dex_file_names=*/ true,
- error_msg)) {
- return false;
- }
- }
- }
-
- // Do a full comparison of the class loaders, including comparing their dex files.
- if (!CompareClassLoaders(soa,
- image_class_loader->GetParent(),
- class_loader->GetParent(),
- /*check_dex_file_names=*/ true,
- error_msg)) {
- return false;
- }
- return true;
-}
-
class CHAOnDeleteUpdateClassVisitor {
public:
explicit CHAOnDeleteUpdateClassVisitor(LinearAlloc* alloc)
@@ -2315,30 +2152,6 @@
}
}
}
- std::string temp_error_msg;
- std::list<ObjPtr<mirror::String>> image_dex_file_names;
- bool success = GetDexFileNames(
- soa, image_class_loader.Get(), &image_dex_file_names, &temp_error_msg);
- if (success) {
- // Ignore the number of image dex files since we are adding those to the class loader anyways.
- CHECK_GE(static_cast<size_t>(image_dex_file_names.size()),
- static_cast<size_t>(dex_caches->GetLength()));
- size_t image_count = image_dex_file_names.size() - dex_caches->GetLength();
- image_dex_file_names.resize(image_count);
- success = success && CompareDexFiles(image_dex_file_names,
- loader_dex_file_names,
- &temp_error_msg);
- success = success && CompareClassLoaders(soa,
- image_class_loader.Get(),
- class_loader.Get(),
- /*check_dex_file_names=*/ false,
- &temp_error_msg);
- }
- if (!success) {
- *error_msg = StringPrintf("Rejecting application image due to class loader mismatch: '%s'",
- temp_error_msg.c_str());
- return false;
- }
}
if (kSanityCheckObjects) {