diff options
-rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 17 | ||||
-rw-r--r-- | services/core/java/com/android/server/am/ActivityStarter.java | 56 |
2 files changed, 57 insertions, 16 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 91c4571ee491..a426cbc2a38c 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -4746,9 +4746,9 @@ public final class ActivityManagerService extends ActivityManagerNative userId, false, ALLOW_FULL_ONLY, "startActivityInPackage", null); // TODO: Switch to user app stacks here. - int ret = mActivityStarter.startActivityMayWait(null, uid, callingPackage, intent, - resolvedType, null, null, resultTo, resultWho, requestCode, startFlags, - null, null, null, bOptions, false, userId, container, inTask); + int ret = mActivityStarter.startActivityMayWait(null, uid, ActivityStarter.PID_NULL, uid, + callingPackage, intent, resolvedType, null, null, resultTo, resultWho, requestCode, + startFlags, null, null, null, bOptions, false, userId, container, inTask); return ret; } @@ -4768,12 +4768,19 @@ public final class ActivityManagerService extends ActivityManagerNative final int startActivitiesInPackage(int uid, String callingPackage, Intent[] intents, String[] resolvedTypes, IBinder resultTo, Bundle bOptions, int userId) { + return startActivitiesInPackage(uid, ActivityStarter.PID_NULL, UserHandle.USER_NULL, + callingPackage, intents, resolvedTypes, resultTo, bOptions, userId); + } + + final int startActivitiesInPackage(int uid, int realCallingPid, int realCallingUid, + String callingPackage, Intent[] intents, String[] resolvedTypes, + IBinder resultTo, Bundle bOptions, int userId) { userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, ALLOW_FULL_ONLY, "startActivityInPackage", null); // TODO: Switch to user app stacks here. - int ret = mActivityStarter.startActivities(null, uid, callingPackage, intents, resolvedTypes, - resultTo, bOptions, userId); + int ret = mActivityStarter.startActivities(null, uid, realCallingPid, realCallingUid, + callingPackage, intents, resolvedTypes, resultTo, bOptions, userId); return ret; } diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index aacc9de8896d..99784f14113a 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -127,6 +127,8 @@ import java.util.ArrayList; * an activity and associated task and stack. */ class ActivityStarter { + public static final int PID_NULL = 0; + private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStarter" : TAG_AM; private static final String TAG_RESULTS = TAG + POSTFIX_RESULTS; private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS; @@ -713,12 +715,24 @@ class ActivityStarter { UserHandle.CURRENT); } + final int startActivityMayWait(IApplicationThread caller, int callingUid, String callingPackage, + Intent intent, String resolvedType, IVoiceInteractionSession voiceSession, + IVoiceInteractor voiceInteractor, IBinder resultTo, String resultWho, int requestCode, + int startFlags, ProfilerInfo profilerInfo, IActivityManager.WaitResult outResult, + Configuration config, Bundle bOptions, boolean ignoreTargetSecurity, int userId, + IActivityContainer iContainer, TaskRecord inTask) { + return startActivityMayWait(caller, callingUid, PID_NULL, UserHandle.USER_NULL, + callingPackage, intent, resolvedType, voiceSession, voiceInteractor, resultTo, + resultWho, requestCode, startFlags, profilerInfo, outResult, config, bOptions, + ignoreTargetSecurity, userId, iContainer, inTask); + } + final int startActivityMayWait(IApplicationThread caller, int callingUid, - String callingPackage, Intent intent, String resolvedType, - IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, - IBinder resultTo, String resultWho, int requestCode, int startFlags, - ProfilerInfo profilerInfo, IActivityManager.WaitResult outResult, Configuration config, - Bundle bOptions, boolean ignoreTargetSecurity, int userId, + int requestRealCallingPid, int requestRealCallingUid, String callingPackage, + Intent intent, String resolvedType, IVoiceInteractionSession voiceSession, + IVoiceInteractor voiceInteractor, IBinder resultTo, String resultWho, int requestCode, + int startFlags, ProfilerInfo profilerInfo, IActivityManager.WaitResult outResult, + Configuration config, Bundle bOptions, boolean ignoreTargetSecurity, int userId, IActivityContainer iContainer, TaskRecord inTask) { // Refuse possible leaked file descriptors if (intent != null && intent.hasFileDescriptors()) { @@ -769,8 +783,14 @@ class ActivityStarter { // Cannot start a child activity if the parent is not resumed. return ActivityManager.START_CANCELED; } - final int realCallingPid = Binder.getCallingPid(); - final int realCallingUid = Binder.getCallingUid(); + + final int realCallingPid = requestRealCallingPid != PID_NULL + ? requestRealCallingPid + : Binder.getCallingPid(); + final int realCallingUid = requestRealCallingUid != UserHandle.USER_NULL + ? requestRealCallingUid + : Binder.getCallingUid(); + int callingPid; if (callingUid >= 0) { callingPid = -1; @@ -781,6 +801,7 @@ class ActivityStarter { callingPid = callingUid = -1; } + final ActivityStack stack; if (container == null || container.mStack.isOnHomeDisplay()) { stack = mSupervisor.mFocusedStack; @@ -922,8 +943,16 @@ class ActivityStarter { } final int startActivities(IApplicationThread caller, int callingUid, String callingPackage, - Intent[] intents, String[] resolvedTypes, IBinder resultTo, - Bundle bOptions, int userId) { + Intent[] intents, String[] resolvedTypes, IBinder resultTo, Bundle bOptions, + int userId) { + return startActivities(caller, callingUid, PID_NULL, UserHandle.USER_NULL, callingPackage, + intents, resolvedTypes, resultTo, bOptions, userId); + } + + final int startActivities(IApplicationThread caller, int callingUid, + int incomingRealCallingPid, int incomingRealCallingUid, String callingPackage, + Intent[] intents, String[] resolvedTypes, IBinder resultTo, Bundle bOptions, + int userId) { if (intents == null) { throw new NullPointerException("intents is null"); } @@ -934,8 +963,13 @@ class ActivityStarter { throw new IllegalArgumentException("intents are length different than resolvedTypes"); } - final int realCallingPid = Binder.getCallingPid(); - final int realCallingUid = Binder.getCallingUid(); + final int realCallingPid = incomingRealCallingPid != PID_NULL + ? incomingRealCallingPid + : Binder.getCallingPid(); + + final int realCallingUid = incomingRealCallingUid != UserHandle.USER_NULL + ? incomingRealCallingUid + : Binder.getCallingUid(); int callingPid; if (callingUid >= 0) { |