From 39cdae1f82e31cd9e40dd10c3ae7fbc3ddc98270 Mon Sep 17 00:00:00 2001 From: Alex Buynytskyy Date: Tue, 18 Jan 2022 13:01:30 -0800 Subject: [PATCH] Installation fail for mismatched certificates. Bug: 213398637 Fixes: 213398637 Test: atest PackageManagerShellCommandTest Change-Id: Iab480157163627af2a2e9c49439460b2f58810c2 --- .../server/pm/InstallPackageHelper.java | 30 +++++++++++++++---- .../server/pm/SharedLibrariesImpl.java | 4 +-- .../server/pm/SharedLibrariesImplTest.kt | 3 +- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index d002c2649de0a..0d65463d729d9 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -1207,17 +1207,33 @@ final class InstallPackageHelper { } PackageSetting ps = mPm.mSettings.getPackageLPr(pkgName); - if (ps != null) { - if (DEBUG_INSTALL) Slog.d(TAG, "Existing package: " + ps); + PackageSetting signatureCheckPs = ps; + + // SDK libs can have other major versions with different package names. + if (signatureCheckPs == null && parsedPackage.isSdkLibrary()) { + WatchedLongSparseArray libraryInfos = + mSharedLibraries.getSharedLibraryInfos( + parsedPackage.getSdkLibName()); + if (libraryInfos != null && libraryInfos.size() > 0) { + // Any existing version would do. + SharedLibraryInfo libraryInfo = libraryInfos.valueAt(0); + signatureCheckPs = mPm.mSettings.getPackageLPr(libraryInfo.getPackageName()); + } + } + + if (signatureCheckPs != null) { + if (DEBUG_INSTALL) { + Slog.d(TAG, + "Existing package for signature checking: " + signatureCheckPs); + } // Static shared libs have same package with different versions where // we internally use a synthetic package name to allow multiple versions // of the same package, therefore we need to compare signatures against // the package setting for the latest library version. - PackageSetting signatureCheckPs = ps; if (parsedPackage.isStaticSharedLibrary()) { - SharedLibraryInfo libraryInfo = mSharedLibraries.getLatestSharedLibraVersionLPr( - parsedPackage); + SharedLibraryInfo libraryInfo = + mSharedLibraries.getLatestStaticSharedLibraVersionLPr(parsedPackage); if (libraryInfo != null) { signatureCheckPs = mPm.mSettings.getPackageLPr( libraryInfo.getPackageName()); @@ -1256,6 +1272,10 @@ final class InstallPackageHelper { throw new PrepareFailure(e.error, e.getMessage()); } } + } + + if (ps != null) { + if (DEBUG_INSTALL) Slog.d(TAG, "Existing package: " + ps); if (ps.getPkg() != null) { systemApp = ps.getPkg().isSystem(); diff --git a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java index aa230508287ec..2227a7810dec1 100644 --- a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java +++ b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java @@ -384,7 +384,7 @@ public final class SharedLibrariesImpl implements SharedLibrariesRead, Watchable * @return The latest version of shared library info. */ @GuardedBy("mPm.mLock") - @Nullable SharedLibraryInfo getLatestSharedLibraVersionLPr(@NonNull AndroidPackage pkg) { + @Nullable SharedLibraryInfo getLatestStaticSharedLibraVersionLPr(@NonNull AndroidPackage pkg) { WatchedLongSparseArray versionedLib = mSharedLibraries.get( pkg.getStaticSharedLibName()); if (versionedLib == null) { @@ -416,7 +416,7 @@ public final class SharedLibrariesImpl implements SharedLibrariesRead, Watchable PackageSetting sharedLibPackage = null; synchronized (mPm.mLock) { final SharedLibraryInfo latestSharedLibraVersionLPr = - getLatestSharedLibraVersionLPr(scanResult.mRequest.mParsedPackage); + getLatestStaticSharedLibraVersionLPr(scanResult.mRequest.mParsedPackage); if (latestSharedLibraVersionLPr != null) { sharedLibPackage = mPm.mSettings.getPackageLPr( latestSharedLibraVersionLPr.getPackageName()); diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt index 6de12cb987198..2735e3d21ef7b 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt @@ -196,7 +196,8 @@ class SharedLibrariesImplTest { val newLibSetting = addPackage(STATIC_LIB_PACKAGE_NAME + "_" + 10, 10L, staticLibrary = STATIC_LIB_NAME, staticLibraryVersion = 10L) - val latestInfo = mSharedLibrariesImpl.getLatestSharedLibraVersionLPr(newLibSetting.pkg)!! + val latestInfo = + mSharedLibrariesImpl.getLatestStaticSharedLibraVersionLPr(newLibSetting.pkg)!! assertThat(latestInfo).isNotNull() assertThat(latestInfo.name).isEqualTo(STATIC_LIB_NAME)