From a63a2e971079f57d86acd2e736be99fe3f4f4a91 Mon Sep 17 00:00:00 2001 From: Calin Juravle Date: Wed, 15 Apr 2020 20:02:00 -0700 Subject: Search only the current class loader when checking for duplicates Do not check the entire class loader hierarchy for duplicate dex files because some use cases might be valid. The most error prone cases are actually duplicates within the same class loader. Test: gtest Bug: 154032843 Change-Id: I8c5efd4b2053a5b4052de6041d561554dddf4780 Merged-In: I8c5efd4b2053a5b4052de6041d561554dddf4780 (cherry picked from commit 86ac525b1f42876518c9040aeaf1a9710cc4332e) --- runtime/class_loader_context_test.cc | 41 +++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 10 deletions(-) (limited to 'runtime/class_loader_context_test.cc') diff --git a/runtime/class_loader_context_test.cc b/runtime/class_loader_context_test.cc index ff466c0d96..2447616729 100644 --- a/runtime/class_loader_context_test.cc +++ b/runtime/class_loader_context_test.cc @@ -1637,23 +1637,44 @@ TEST_F(ClassLoaderContextTest, CreateContextForClassLoaderWithSharedLibraries) { ClassLoaderContext::VerificationResult::kVerifies); } -TEST_F(ClassLoaderContextTest, CheckForDuplicateDexFiles) { - jobject class_loader_a = LoadDexInPathClassLoader("Main", nullptr); - jobject class_loader_b = - LoadDexInInMemoryDexClassLoader("MyClass", class_loader_a); +TEST_F(ClassLoaderContextTest, CheckForDuplicateDexFilesNotFoundSingleCL) { + jobject class_loader = LoadDexInPathClassLoader("Main", nullptr); - std::unique_ptr context = - CreateContextForClassLoader(class_loader_b); + std::unique_ptr context = CreateContextForClassLoader(class_loader); - std::vector result = context->CheckForDuplicateDexFiles( + std::set result = context->CheckForDuplicateDexFiles( std::vector()); ASSERT_EQ(0u, result.size()); - std::vector> dex1 = OpenTestDexFiles("Main"); + std::vector> dex1 = OpenTestDexFiles("ForClassLoaderA"); std::vector dex1_raw = MakeNonOwningPointerVector(dex1); result = context->CheckForDuplicateDexFiles(dex1_raw); - ASSERT_EQ(1u, result.size()); - ASSERT_EQ(dex1_raw[0], result[0]); + ASSERT_EQ(0u, result.size()); +} + +TEST_F(ClassLoaderContextTest, CheckForDuplicateDexFilesFound) { + jobject class_loader = LoadDexInPathClassLoader(std::vector { "Main", "Main" }, nullptr); + + std::unique_ptr context = CreateContextForClassLoader(class_loader); + + std::vector> dex1 = OpenTestDexFiles("Main"); + std::vector dex1_raw = MakeNonOwningPointerVector(dex1); + std::set result = context->CheckForDuplicateDexFiles(dex1_raw); + ASSERT_EQ(1u, result.size()) << context->EncodeContextForOatFile(""); + ASSERT_EQ(dex1_raw[0], *(result.begin())); +} + + +TEST_F(ClassLoaderContextTest, CheckForDuplicateCrossCLNotFound) { + jobject class_loader_a = LoadDexInPathClassLoader("ForClassLoaderA", nullptr); + jobject class_loader_b = LoadDexInInMemoryDexClassLoader("ForClassLoaderB", class_loader_a); + + std::unique_ptr context = CreateContextForClassLoader(class_loader_b); + + std::vector> dex1 = OpenTestDexFiles("ForClassLoaderA"); + std::vector dex1_raw = MakeNonOwningPointerVector(dex1); + std::set result = context->CheckForDuplicateDexFiles(dex1_raw); + ASSERT_EQ(0u, result.size()); } } // namespace art -- cgit v1.2.3-59-g8ed1b