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

Commit c254de07 authored by Jaekyun Seok's avatar Jaekyun Seok
Browse files

Fix deadlock when ParallelPackageParserCallback is used

Bug: 77232370
Test: succeeded building and tested with taimen
Change-Id: I425686c65a3cee88c10fceb7b5d0b5d89e49fc70
parent 740d3719
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -808,7 +808,7 @@ public class PackageManagerService extends IPackageManager.Stub
        }
        final String[] getStaticOverlayPaths(List<PackageParser.Package> overlayPackages,
                String targetPath) {
                String targetPath, Object installLock) {
            if (overlayPackages == null || overlayPackages.isEmpty()) {
                return null;
            }
@@ -828,7 +828,16 @@ public class PackageManagerService extends IPackageManager.Stub
                    //
                    // OverlayManagerService will update each of them with a correct gid from its
                    // target package app id.
                    synchronized (mInstallLock) {
                    if (installLock != null) {
                        synchronized (installLock) {
                            mInstaller.idmap(targetPath, overlayPackage.baseCodePath,
                                    UserHandle.getSharedAppGid(
                                            UserHandle.getUserGid(UserHandle.USER_SYSTEM)));
                        }
                    } else {
                        // We can call mInstaller without holding mInstallLock because mInstallLock
                        // is held before running parallel parsing.
                        // Moreover holding mInstallLock on each parsing thread causes dead-lock.
                        mInstaller.idmap(targetPath, overlayPackage.baseCodePath,
                                UserHandle.getSharedAppGid(
                                        UserHandle.getUserGid(UserHandle.USER_SYSTEM)));
@@ -853,7 +862,7 @@ public class PackageManagerService extends IPackageManager.Stub
            }
            // It is safe to keep overlayPackages without holding mPackages because static overlay
            // packages can't be uninstalled or disabled.
            return getStaticOverlayPaths(overlayPackages, targetPath);
            return getStaticOverlayPaths(overlayPackages, targetPath, mInstallLock);
        }
        @Override public final String[] getOverlayApks(String targetPackageName) {
@@ -890,7 +899,7 @@ public class PackageManagerService extends IPackageManager.Stub
            return mOverlayPackages == null ? null :
                    getStaticOverlayPaths(
                            getStaticOverlayPackages(mOverlayPackages, targetPackageName),
                            targetPath);
                            targetPath, null);
        }
    }