From 39b442cb6120c6f578495276a1e31490e4a0efbb Mon Sep 17 00:00:00 2001 From: Dan Zimmerman Date: Wed, 15 Jan 2020 11:45:03 -0800 Subject: [PATCH] [DexManager] Fix off-by-N error in DexManager when reporting dex loads In this loop the continue statement skips over incrementing dexPathIndex. In effect the classloader context that reported for a given dex file may be incorrect (specifically in the situation when the user loads a primary dex file and a secondary dex file in the same ClassLoader) Bug: 147089377 Test: atest com.android.server.pm.dex.DexManagerTests Change-Id: I7d3df507787f758537625b702131a2f4f76190e6 --- .../com/android/server/pm/dex/DexManager.java | 1 + .../server/pm/dex/DexManagerTests.java | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java index f56231fc02afa..9e86a4bd28803 100644 --- a/services/core/java/com/android/server/pm/dex/DexManager.java +++ b/services/core/java/com/android/server/pm/dex/DexManager.java @@ -229,6 +229,7 @@ public class DexManager { // If the dex file is the primary apk (or a split) and not isUsedByOtherApps // do not record it. This case does not bring any new usable information // and can be safely skipped. + dexPathIndex++; continue; } diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java index 0196279cbf564..a4ba056b96a82 100644 --- a/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java +++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java @@ -159,6 +159,31 @@ public class DexManagerTests { assertHasDclInfo(mFooUser0, mFooUser0, fooSecondaries); } + @Test + public void testNotifyPrimaryAndSecondary() { + List dexFiles = mFooUser0.getBaseAndSplitDexPaths(); + List secondaries = mFooUser0.getSecondaryDexPaths(); + int baseAndSplitCount = dexFiles.size(); + dexFiles.addAll(secondaries); + + notifyDexLoad(mFooUser0, dexFiles, mUser0); + + PackageUseInfo pui = getPackageUseInfo(mFooUser0); + assertIsUsedByOtherApps(mFooUser0, pui, false); + assertEquals(secondaries.size(), pui.getDexUseInfoMap().size()); + + String[] allExpectedContexts = DexoptUtils.processContextForDexLoad( + Arrays.asList(mFooUser0.mClassLoader), + Arrays.asList(String.join(File.pathSeparator, dexFiles))); + String[] secondaryExpectedContexts = Arrays.copyOfRange(allExpectedContexts, + baseAndSplitCount, dexFiles.size()); + + assertSecondaryUse(mFooUser0, pui, secondaries, /*isUsedByOtherApps*/false, mUser0, + secondaryExpectedContexts); + + assertHasDclInfo(mFooUser0, mFooUser0, secondaries); + } + @Test public void testNotifySecondaryForeign() { // Foo loads bar secondary files.