diff options
3 files changed, 55 insertions, 11 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 90bd32f64d68..03278425a520 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -4891,9 +4891,9 @@ public class ActivityManagerService extends IActivityManager.Stub 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, reason); + 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, reason); return ret; } @@ -4914,13 +4914,20 @@ public class ActivityManagerService extends IActivityManager.Stub 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) { final String reason = "startActivityInPackage"; userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, ALLOW_FULL_ONLY, reason, null); // TODO: Switch to user app stacks here. - int ret = mActivityStarter.startActivities(null, uid, callingPackage, intents, resolvedTypes, - resultTo, bOptions, userId, reason); + int ret = mActivityStarter.startActivities(null, uid, realCallingPid, realCallingUid, + callingPackage, intents, resolvedTypes, resultTo, bOptions, userId, reason); 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 a145435976fa..7401fff433e9 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -137,6 +137,8 @@ import java.util.Date; * 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; @@ -672,6 +674,20 @@ class ActivityStarter { ProfilerInfo profilerInfo, WaitResult outResult, Configuration globalConfig, Bundle bOptions, boolean ignoreTargetSecurity, int userId, IActivityContainer iContainer, TaskRecord inTask, String reason) { + return startActivityMayWait(caller, callingUid, PID_NULL, UserHandle.USER_NULL, + callingPackage, intent, resolvedType, voiceSession, voiceInteractor, resultTo, + resultWho, requestCode, startFlags, profilerInfo, outResult, globalConfig, bOptions, + ignoreTargetSecurity, userId, iContainer, inTask, reason); + } + + final int startActivityMayWait(IApplicationThread caller, int callingUid, + int requestRealCallingPid, int requestRealCallingUid, + String callingPackage, Intent intent, String resolvedType, + IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, + IBinder resultTo, String resultWho, int requestCode, int startFlags, + ProfilerInfo profilerInfo, WaitResult outResult, + Configuration globalConfig, Bundle bOptions, boolean ignoreTargetSecurity, int userId, + IActivityContainer iContainer, TaskRecord inTask, String reason) { // Refuse possible leaked file descriptors if (intent != null && intent.hasFileDescriptors()) { throw new IllegalArgumentException("File descriptors passed in Intent"); @@ -732,8 +748,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; @@ -744,6 +766,7 @@ class ActivityStarter { callingPid = callingUid = -1; } + final ActivityStack stack; if (container == null || container.mStack.isOnHomeDisplay()) { stack = mSupervisor.mFocusedStack; @@ -890,6 +913,14 @@ class ActivityStarter { final int startActivities(IApplicationThread caller, int callingUid, String callingPackage, Intent[] intents, String[] resolvedTypes, IBinder resultTo, Bundle bOptions, int userId, String reason) { + return startActivities(caller, callingUid, PID_NULL, UserHandle.USER_NULL, callingPackage, + intents, resolvedTypes, resultTo, bOptions, userId, reason); + } + + final int startActivities(IApplicationThread caller, int callingUid, + int incomingRealCallingPid, int incomingRealCallingUid, String callingPackage, + Intent[] intents, String[] resolvedTypes, IBinder resultTo, + Bundle bOptions, int userId, String reason) { if (intents == null) { throw new NullPointerException("intents is null"); } @@ -900,8 +931,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) { diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java index cad5dcf6b565..62138edf2998 100644 --- a/services/core/java/com/android/server/am/PendingIntentRecord.java +++ b/services/core/java/com/android/server/am/PendingIntentRecord.java @@ -341,8 +341,9 @@ final class PendingIntentRecord extends IIntentSender.Stub { } allIntents[allIntents.length-1] = finalIntent; allResolvedTypes[allResolvedTypes.length-1] = resolvedType; - owner.startActivitiesInPackage(uid, key.packageName, allIntents, - allResolvedTypes, resultTo, options, userId); + owner.startActivitiesInPackage(uid, callingPid, callingUid, + key.packageName, allIntents, allResolvedTypes, resultTo, + options, userId); } else { owner.startActivityInPackage(uid, key.packageName, finalIntent, resolvedType, resultTo, resultWho, requestCode, 0, |