From 3fb5b5d29c1cdb2ec094da6eff37ee6298470bbd Mon Sep 17 00:00:00 2001 From: Fyodor Kupolov Date: Wed, 24 Feb 2016 18:14:33 -0800 Subject: [PATCH] Call prepareAppDataAfterInstall without mPackages lock prepareAppDataAfterInstallInternal may call into ActivityManager which will try to obtain a lock in a reversed order, which causes a deadlock. Bug: 27336728 Change-Id: I91bb74cd06c6aa6cee057bab5972b0275d12125b --- .../java/com/android/server/pm/PackageManagerService.java | 8 +++++--- 1 file changed, 5 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 9b70802a750b1..14fbaee00ff84 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -10668,14 +10668,14 @@ public class PackageManagerService extends IPackageManager.Stub { pkgSetting.setInstalled(true, userId); pkgSetting.setHidden(false, userId); mSettings.writePackageRestrictionsLPr(userId); - if (pkgSetting.pkg != null) { - prepareAppDataAfterInstall(pkgSetting.pkg); - } installed = true; } } if (installed) { + if (pkgSetting.pkg != null) { + prepareAppDataAfterInstall(pkgSetting.pkg); + } sendPackageAddedForUser(packageName, pkgSetting, userId); } } finally { @@ -18040,6 +18040,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); * correct for all installed apps. If there is an ownership mismatch, it * will try recovering system apps by wiping data; third-party app data is * left intact. + *

+ * Note: To avoid a deadlock, do not call this method with {@code mPackages} lock held */ private void prepareAppDataAfterInstall(PackageParser.Package pkg) { prepareAppDataAfterInstallInternal(pkg);