diff options
| -rw-r--r-- | services/core/java/com/android/server/am/ProcessList.java | 70 |
1 files changed, 38 insertions, 32 deletions
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 38cb501111ca..62e703bb0836 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -1551,6 +1551,43 @@ public final class ProcessList { } } + private int[] computeGidsForProcess(int mountExternal, int uid, int[] permGids, + String packageName) { + ArrayList<Integer> gidList = new ArrayList<>(permGids.length + 5); + + final int sharedAppGid = UserHandle.getSharedAppGid(UserHandle.getAppId(uid)); + final int cacheAppGid = UserHandle.getCacheAppGid(UserHandle.getAppId(uid)); + final int userGid = UserHandle.getUserGid(UserHandle.getUserId(uid)); + + // Add shared application and profile GIDs so applications can share some + // resources like shared libraries and access user-wide resources + for (int permGid : permGids) { + gidList.add(permGid); + } + if (sharedAppGid != UserHandle.ERR_GID) { + gidList.add(sharedAppGid); + } + if (cacheAppGid != UserHandle.ERR_GID) { + gidList.add(cacheAppGid); + } + if (userGid != UserHandle.ERR_GID) { + gidList.add(userGid); + } + if (mountExternal == Zygote.MOUNT_EXTERNAL_ANDROID_WRITABLE) { + gidList.add(Process.SDCARD_RW_GID); + } + if (packageName.equals("com.android.externalstorage")) { + // Allows access to 'unreliable' (USB OTG) volumes via SAF + gidList.add(Process.MEDIA_RW_GID); + } + + int[] gidArray = new int[gidList.size()]; + for (int i = 0; i < gidArray.length; i++) { + gidArray[i] = gidList.get(i); + } + return gidArray; + } + /** * @return {@code true} if process start is successful, false otherwise. */ @@ -1625,38 +1662,7 @@ public final class ProcessList { } } - int numGids = 3; - if (mountExternal == Zygote.MOUNT_EXTERNAL_ANDROID_WRITABLE - || app.info.packageName.equals("com.android.externalstorage")) { - numGids++; - } - - /* - * Add shared application and profile GIDs so applications can share some - * resources like shared libraries and access user-wide resources - */ - if (ArrayUtils.isEmpty(permGids)) { - gids = new int[numGids]; - } else { - gids = new int[permGids.length + numGids]; - System.arraycopy(permGids, 0, gids, numGids, permGids.length); - } - gids[0] = UserHandle.getSharedAppGid(UserHandle.getAppId(uid)); - gids[1] = UserHandle.getCacheAppGid(UserHandle.getAppId(uid)); - gids[2] = UserHandle.getUserGid(UserHandle.getUserId(uid)); - - if (numGids > 3) { - if (app.info.packageName.equals("com.android.externalstorage")) { - // Allows access to 'unreliable' (USB OTG) volumes via SAF - gids[3] = Process.MEDIA_RW_GID; - } else if (mountExternal == Zygote.MOUNT_EXTERNAL_ANDROID_WRITABLE) { - gids[3] = Process.SDCARD_RW_GID; - } - } - - // Replace any invalid GIDs - if (gids[0] == UserHandle.ERR_GID) gids[0] = gids[2]; - if (gids[1] == UserHandle.ERR_GID) gids[1] = gids[2]; + gids = computeGidsForProcess(mountExternal, uid, permGids, app.info.packageName); } app.mountMode = mountExternal; checkSlow(startTime, "startProcess: building args"); |