From 05461245adfe970a1ef3b0a46f23449d1556faa1 Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Tue, 13 Nov 2018 15:46:27 +0000 Subject: [PATCH] Check for null in applyDefiningSharedLibraryUpdateLocked. Handle two cases: 1) We haven't been able to create the shared library. The package manager still installs the package, but doesn't create the shared library. 2) When installing a shared library, we update shared lib dependency mappings before scanning. In the case that we're installing a new shared library, we will not have reference to that shared library in memory. This change adds a null check to account for such a scenario. bug: 119438703 bug: 119497540 Test: atest android.os.cts.StaticSharedLibsHostTests#testAppCanSeeOnlyLibrariesItDependOnFullMode (cherry picked from commit c52d8661f109012bd53cda45b18721f544c0eddd) Change-Id: Ied5b27be193f575ef05a121b7c5b6361ed52305a Merged-In: I93d67f79ad0a58acd8cd4cb961cf82ada085821c --- .../android/server/pm/PackageManagerService.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index bdb2f4cbefd82..2a605f555bdf7 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -9483,7 +9483,7 @@ public class PackageManagerService extends IPackageManager.Stub } } - private SharedLibraryInfo getSharedLibraryInfoLPr(String name, long version) { + private @Nullable SharedLibraryInfo getSharedLibraryInfoLPr(String name, long version) { LongSparseArray versionedLib = mSharedLibraries.get(name); if (versionedLib == null) { return null; @@ -9728,16 +9728,26 @@ public class PackageManagerService extends IPackageManager.Stub private void applyDefiningSharedLibraryUpdateLocked( PackageParser.Package pkg, SharedLibraryInfo libInfo, BiConsumer action) { + // Note that libraries defined by this package may be null if: + // - Package manager was unable to create the shared library. The package still + // gets installed, but the shared library does not get created. + // Or: + // - Package manager is in a state where package isn't scanned yet. This will + // get called again after scanning to fix the dependencies. if (pkg.isLibrary()) { if (pkg.staticSharedLibName != null) { SharedLibraryInfo definedLibrary = getSharedLibraryInfoLPr( pkg.staticSharedLibName, pkg.staticSharedLibVersion); - action.accept(definedLibrary, libInfo); + if (definedLibrary != null) { + action.accept(definedLibrary, libInfo); + } } else { for (String libraryName : pkg.libraryNames) { SharedLibraryInfo definedLibrary = getSharedLibraryInfoLPr( libraryName, SharedLibraryInfo.VERSION_UNDEFINED); - action.accept(definedLibrary, libInfo); + if (definedLibrary != null) { + action.accept(definedLibrary, libInfo); + } } } }