summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Hai Zhang <zhanghai@google.com> 2019-09-24 17:18:05 -0700
committer Hai Zhang <zhanghai@google.com> 2019-09-27 17:11:45 +0000
commit109ff9d021cde0334f7ad6d73d4dd13d09f89e8d (patch)
tree28a00ca7b1ac966832c4827f0cc58f36f285a62f
parent703ce15fef823e865ae8a1c14538e2887c3e17e0 (diff)
Fix deadlock when getting/setting default browser, dialer and home.
The lock shouldn't be held when calling into controller. Fixes: 138656038 Test: atest com.google.android.gts.playstore.PackageManagerHostTest#testPackageManager Change-Id: I590a2162ac75c6a2fb6ccc818d552e4832dd21f2
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerService.java68
1 files changed, 39 insertions, 29 deletions
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index a9e3f046e425..183a9a8a66e0 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -1678,10 +1678,11 @@ public class PermissionManagerService extends IPermissionManager.Stub {
if (mPackageManagerInt.getInstantAppPackageName(callingUid) != null) {
return null;
}
+ DefaultBrowserProvider provider;
synchronized (mLock) {
- return mDefaultBrowserProvider == null
- ? null : mDefaultBrowserProvider.getDefaultBrowser(userId);
+ provider = mDefaultBrowserProvider;
}
+ return provider != null ? provider.getDefaultBrowser(userId) : null;
}
@Override
@@ -1697,23 +1698,27 @@ public class PermissionManagerService extends IPermissionManager.Stub {
private boolean setDefaultBrowserInternal(String packageName, boolean async,
boolean doGrant, int userId) {
+ if (userId == UserHandle.USER_ALL) {
+ return false;
+ }
+ DefaultBrowserProvider provider;
synchronized (mLock) {
- if (userId == UserHandle.USER_ALL) {
- return false;
- }
- if (mDefaultBrowserProvider == null) {
+ provider = mDefaultBrowserProvider;
+ }
+ if (provider == null) {
+ return false;
+ }
+ if (async) {
+ provider.setDefaultBrowserAsync(packageName, userId);
+ } else {
+ if (!provider.setDefaultBrowser(packageName, userId)) {
return false;
}
- if (async) {
- mDefaultBrowserProvider.setDefaultBrowserAsync(packageName, userId);
- } else {
- if (!mDefaultBrowserProvider.setDefaultBrowser(packageName, userId)) {
- return false;
- }
- }
- if (doGrant && packageName != null) {
- mDefaultPermissionGrantPolicy
- .grantDefaultPermissionsToDefaultBrowser(packageName, userId);
+ }
+ if (doGrant && packageName != null) {
+ synchronized (mLock) {
+ mDefaultPermissionGrantPolicy.grantDefaultPermissionsToDefaultBrowser(packageName,
+ userId);
}
}
return true;
@@ -4315,15 +4320,17 @@ public class PermissionManagerService extends IPermissionManager.Stub {
@Override
public void setDefaultHome(String packageName, int userId, Consumer<Boolean> callback) {
+ if (userId == UserHandle.USER_ALL) {
+ return;
+ }
+ DefaultHomeProvider provider;
synchronized (mLock) {
- if (userId == UserHandle.USER_ALL) {
- return;
- }
- if (mDefaultHomeProvider == null) {
- return;
- }
- mDefaultHomeProvider.setDefaultHomeAsync(packageName, userId, callback);
+ provider = mDefaultHomeProvider;
+ }
+ if (provider == null) {
+ return;
}
+ provider.setDefaultHomeAsync(packageName, userId, callback);
}
@Override
@@ -4384,26 +4391,29 @@ public class PermissionManagerService extends IPermissionManager.Stub {
@Override
public String getDefaultBrowser(int userId) {
+ DefaultBrowserProvider provider;
synchronized (mLock) {
- return mDefaultBrowserProvider == null
- ? null : mDefaultBrowserProvider.getDefaultBrowser(userId);
+ provider = mDefaultBrowserProvider;
}
+ return provider != null ? provider.getDefaultBrowser(userId) : null;
}
@Override
public String getDefaultDialer(int userId) {
+ DefaultDialerProvider provider;
synchronized (mLock) {
- return mDefaultDialerProvider == null
- ? null : mDefaultDialerProvider.getDefaultDialer(userId);
+ provider = mDefaultDialerProvider;
}
+ return provider != null ? provider.getDefaultDialer(userId) : null;
}
@Override
public String getDefaultHome(int userId) {
+ DefaultHomeProvider provider;
synchronized (mLock) {
- return mDefaultHomeProvider == null
- ? null : mDefaultHomeProvider.getDefaultHome(userId);
+ provider = mDefaultHomeProvider;
}
+ return provider != null ? provider.getDefaultHome(userId) : null;
}
@Override