From 4c49fbd08cac57a9058c9d6d1b354aa696a1639d Mon Sep 17 00:00:00 2001 From: Jaekyun Seok Date: Tue, 27 Mar 2018 15:15:41 +0900 Subject: [PATCH] Call mInstaller.idmap() without holding mPackages It isn't expected to call mInstaller.idmap() with holding mPackages after a system is booted. So mInstaller.idmap() should be called without that. Bug: 73263584 Test: succeeded building and tested with taimen Change-Id: Ib7a7b650862438753a5eafe25e14fb01fbb0482c --- .../server/pm/PackageManagerService.java | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 950d8dfc28fb6..b5902ad393980 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -778,8 +778,14 @@ public class PackageManagerService extends IPackageManager.Stub return PackageManagerService.this.hasSystemFeature(feature, 0); } - final List getStaticOverlayPackagesLocked( + final List getStaticOverlayPackages( Collection allPackages, String targetPackageName) { + if ("android".equals(targetPackageName)) { + // Static RROs targeting to "android", ie framework-res.apk, are already applied by + // native AssetManager. + return null; + } + List overlayPackages = null; for (PackageParser.Package p : allPackages) { if (targetPackageName.equals(p.mOverlayTarget) && p.mOverlayIsStatic) { @@ -800,16 +806,8 @@ public class PackageManagerService extends IPackageManager.Stub return overlayPackages; } - @GuardedBy("mInstallLock") - final String[] getStaticOverlayPathsLocked(Collection allPackages, - String targetPackageName, String targetPath) { - if ("android".equals(targetPackageName)) { - // Static RROs targeting to "android", ie framework-res.apk, are already applied by - // native AssetManager. - return null; - } - List overlayPackages = - getStaticOverlayPackagesLocked(allPackages, targetPackageName); + final String[] getStaticOverlayPaths(List overlayPackages, + String targetPath) { if (overlayPackages == null || overlayPackages.isEmpty()) { return null; } @@ -829,9 +827,11 @@ public class PackageManagerService extends IPackageManager.Stub // // OverlayManagerService will update each of them with a correct gid from its // target package app id. - mInstaller.idmap(targetPath, overlayPackage.baseCodePath, - UserHandle.getSharedAppGid( - UserHandle.getUserGid(UserHandle.USER_SYSTEM))); + synchronized (mInstallLock) { + mInstaller.idmap(targetPath, overlayPackage.baseCodePath, + UserHandle.getSharedAppGid( + UserHandle.getUserGid(UserHandle.USER_SYSTEM))); + } if (overlayPathList == null) { overlayPathList = new ArrayList(); } @@ -845,10 +845,14 @@ public class PackageManagerService extends IPackageManager.Stub } String[] getStaticOverlayPaths(String targetPackageName, String targetPath) { + List overlayPackages; synchronized (mPackages) { - return getStaticOverlayPathsLocked( - mPackages.values(), targetPackageName, targetPath); + overlayPackages = getStaticOverlayPackages( + mPackages.values(), targetPackageName); } + // It is safe to keep overlayPackages without holding mPackages because static overlay + // packages can't be uninstalled or disabled. + return getStaticOverlayPaths(overlayPackages, targetPath); } @Override public final String[] getOverlayApks(String targetPackageName) { @@ -883,7 +887,9 @@ public class PackageManagerService extends IPackageManager.Stub // can't happen while running parallel parsing. // Moreover holding mPackages on each parsing thread causes dead-lock. return mOverlayPackages == null ? null : - getStaticOverlayPathsLocked(mOverlayPackages, targetPackageName, targetPath); + getStaticOverlayPaths( + getStaticOverlayPackages(mOverlayPackages, targetPackageName), + targetPath); } }