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 8185e38a0164..649f3caafb5b 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -4738,9 +4738,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;      } @@ -4760,12 +4760,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 bbf09e88abc3..5ef7abae40ee 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -126,6 +126,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; @@ -679,12 +681,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()) { @@ -735,8 +749,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; @@ -747,6 +767,7 @@ class ActivityStarter {                  callingPid = callingUid = -1;              } +              final ActivityStack stack;              if (container == null || container.mStack.isOnHomeDisplay()) {                  stack = mSupervisor.mFocusedStack; @@ -888,8 +909,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");          } @@ -900,8 +929,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) {  |