summaryrefslogtreecommitdiff
path: root/services/appwidget
diff options
context:
space:
mode:
authorFyodor Kupolov <fkupolov@google.com>2017-05-05 14:07:50 -0700
committerFyodor Kupolov <fkupolov@google.com>2017-05-05 14:12:29 -0700
commit1406fb72ec05653ec7968a43603759c09702804b (patch)
treed169db866f1af80c0611ea7b270c0c9e22326ec5 /services/appwidget
parentbd886e52b8e1f0f9592fd9390155e9f01bfc16f8 (diff)
Prevent crashes when user is stopping
Added defensive checks to prevent sporadic crashes due to various race conditions when user is stopped: * onPackageBroadcastReceived - moved the check inside the synchronized block. This guarantees that onUserStopped (that also grabs mLock) is not yet called and we can proceed. * stopListening - Since it is invoked before onUserStopped callback, we can call ensureGroupStateLoadedLocked(userId, false). The state will be subsequently cleaned up in the onUserStopped. Test: manual user switching + SecondaryUserContentResolverTest and ManagedUserContentResolverTest Fixes: 37472670 Fixes: 36890589 Change-Id: I44d0a0c004e9c3e6cfb37a24cb8a5b6f20a42f13
Diffstat (limited to 'services/appwidget')
-rw-r--r--services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java13
1 files changed, 6 insertions, 7 deletions
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index ac81565fbf3c..b2712ff140ee 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -373,11 +373,6 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
}
private void onPackageBroadcastReceived(Intent intent, int userId) {
- if (!mUserManager.isUserUnlockingOrUnlocked(userId) ||
- isProfileWithLockedParent(userId)) {
- return;
- }
-
final String action = intent.getAction();
boolean added = false;
boolean changed = false;
@@ -408,7 +403,11 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
}
synchronized (mLock) {
- ensureGroupStateLoadedLocked(userId);
+ if (!mUserManager.isUserUnlockingOrUnlocked(userId) ||
+ isProfileWithLockedParent(userId)) {
+ return;
+ }
+ ensureGroupStateLoadedLocked(userId, /* enforceUserUnlockingOrUnlocked */ false);
Bundle extras = intent.getExtras();
@@ -844,7 +843,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
mSecurityPolicy.enforceCallFromPackage(callingPackage);
synchronized (mLock) {
- ensureGroupStateLoadedLocked(userId);
+ ensureGroupStateLoadedLocked(userId, /* enforceUserUnlockingOrUnlocked */ false);
// NOTE: The lookup is enforcing security across users by making
// sure the caller can only access hosts it owns.