OSDN Git Service

Fix #37305009 : Beam crash in secondary users
authorChristopher Tate <ctate@google.com>
Thu, 20 Apr 2017 23:24:31 +0000 (16:24 -0700)
committerChristopher Tate <ctate@google.com>
Thu, 20 Apr 2017 23:26:00 +0000 (16:26 -0700)
The background-policy check for a-priori app uids needs to be an appId
check rather than nominal uid.

Along the way, even though the code is not invoked after the boot
sequence currently, make the "is this uid on the a-priori list?"
check thread safe.

Bug 37305009
Test: manual

Change-Id: I7c2525f86e73b213057cd4b7f327191ec20c4a6d

services/core/java/com/android/server/am/ActivityManagerService.java

index 6e9e8a4..98b31c0 100644 (file)
@@ -832,9 +832,9 @@ public class ActivityManagerService extends IActivityManager.Stub
     ProcessRecord mHeavyWeightProcess = null;
 
     /**
-     * Non-persistent app uid whitelist for background restrictions
+     * Non-persistent appId whitelist for background restrictions
      */
-    int[] mBackgroundUidWhitelist = new int[] {
+    int[] mBackgroundAppIdWhitelist = new int[] {
             BLUETOOTH_UID
     };
 
@@ -12102,9 +12102,11 @@ public class ActivityManagerService extends IActivityManager.Stub
     }
 
     private boolean uidOnBackgroundWhitelist(final int uid) {
-        final int N = mBackgroundUidWhitelist.length;
+        final int appId = UserHandle.getAppId(uid);
+        final int[] whitelist = mBackgroundAppIdWhitelist;
+        final int N = whitelist.length;
         for (int i = 0; i < N; i++) {
-            if (uid == mBackgroundUidWhitelist[i]) {
+            if (appId == whitelist[i]) {
                 return true;
             }
         }
@@ -12121,11 +12123,11 @@ public class ActivityManagerService extends IActivityManager.Stub
             Slog.i(TAG, "Adding uid " + uid + " to bg uid whitelist");
         }
         synchronized (this) {
-            final int N = mBackgroundUidWhitelist.length;
+            final int N = mBackgroundAppIdWhitelist.length;
             int[] newList = new int[N+1];
-            System.arraycopy(mBackgroundUidWhitelist, 0, newList, 0, N);
-            newList[N] = uid;
-            mBackgroundUidWhitelist = newList;
+            System.arraycopy(mBackgroundAppIdWhitelist, 0, newList, 0, N);
+            newList[N] = UserHandle.getAppId(uid);
+            mBackgroundAppIdWhitelist = newList;
         }
     }