Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4c49fbd0 authored by Jaekyun Seok's avatar Jaekyun Seok
Browse files

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
parent c6d9f7ce
Loading
Loading
Loading
Loading
+23 −17
Original line number Diff line number Diff line
@@ -778,8 +778,14 @@ public class PackageManagerService extends IPackageManager.Stub
            return PackageManagerService.this.hasSystemFeature(feature, 0);
        }
        final List<PackageParser.Package> getStaticOverlayPackagesLocked(
        final List<PackageParser.Package> getStaticOverlayPackages(
                Collection<PackageParser.Package> 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<PackageParser.Package> 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<PackageParser.Package> 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<PackageParser.Package> overlayPackages =
                    getStaticOverlayPackagesLocked(allPackages, targetPackageName);
        final String[] getStaticOverlayPaths(List<PackageParser.Package> 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.
                    synchronized (mInstallLock) {
                        mInstaller.idmap(targetPath, overlayPackage.baseCodePath,
                                UserHandle.getSharedAppGid(
                                        UserHandle.getUserGid(UserHandle.USER_SYSTEM)));
                    }
                    if (overlayPathList == null) {
                        overlayPathList = new ArrayList<String>();
                    }
@@ -845,10 +845,14 @@ public class PackageManagerService extends IPackageManager.Stub
        }
        String[] getStaticOverlayPaths(String targetPackageName, String targetPath) {
            List<PackageParser.Package> 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);
        }
    }