Fix IsolatedUidAllocator for non-primary users.

The UID allocator stores complete UIDs, not app IDs. When removing a UID
from the range, we should therefore also use the UID, not the app ID.

Also added a test to cover this scenario, which passes with this change.

Bug: 146313311
Test: atest ActivityManagerTest
Change-Id: I1118ec73dcee5987e12f35aabce5cfa8cbe407a1
(cherry picked from commit c9a0df2d88)
This commit is contained in:
Martijn Coenen
2019-12-18 07:01:25 +01:00
parent c1b47d49c7
commit c6a61a6b0c
2 changed files with 13 additions and 4 deletions

View File

@@ -422,9 +422,7 @@ public final class ProcessList {
@GuardedBy("ProcessList.this.mService")
void freeIsolatedUidLocked(int uid) {
// Strip out userId
final int appId = UserHandle.getAppId(uid);
mUidUsed.delete(appId);
mUidUsed.delete(uid);
}
};

View File

@@ -346,10 +346,21 @@ public class ActivityManagerServiceTest {
verifyUidRangesNoOverlap(range, range2);
verifyIsolatedUidAllocator(range2);
// Free both, then try to allocate the maximum number of UID ranges
// Free both
allocator.freeUidRangeLocked(appInfo);
allocator.freeUidRangeLocked(appInfo2);
// Verify for a secondary user
ApplicationInfo appInfo3 = new ApplicationInfo();
appInfo3.processName = "com.android.test.app";
appInfo3.uid = 1010000;
final IsolatedUidRange range3 = allocator.getOrCreateIsolatedUidRangeLocked(
appInfo3.processName, appInfo3.uid);
validateAppZygoteIsolatedUidRange(range3);
verifyIsolatedUidAllocator(range3);
allocator.freeUidRangeLocked(appInfo3);
// Try to allocate the maximum number of UID ranges
int maxNumUidRanges = (Process.LAST_APP_ZYGOTE_ISOLATED_UID
- Process.FIRST_APP_ZYGOTE_ISOLATED_UID + 1) / Process.NUM_UIDS_PER_APP_ZYGOTE;
for (int i = 0; i < maxNumUidRanges; i++) {