[RESTRICT AUTOMERGE] Trim the activity info of another uid if no privilege am: 9c19841384

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20223219

Change-Id: I91b20543e1d266adfef18922d34ff14d549e68a5
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Louis Chang
2022-10-28 01:30:10 +00:00
committed by Automerger Merge Worker
4 changed files with 47 additions and 5 deletions

View File

@@ -84,7 +84,8 @@ class AppTaskImpl extends IAppTask.Stub {
if (tr == null) {
throw new IllegalArgumentException("Unable to find task ID " + mTaskId);
}
return mService.getRecentTasks().createRecentTaskInfo(tr);
return mService.getRecentTasks().createRecentTaskInfo(tr,
true /* getTasksAllowed */);
} finally {
Binder.restoreCallingIdentity(origId);
}

View File

@@ -944,7 +944,7 @@ class RecentTasks {
continue;
}
final ActivityManager.RecentTaskInfo rti = createRecentTaskInfo(tr);
final ActivityManager.RecentTaskInfo rti = createRecentTaskInfo(tr, getTasksAllowed);
if (!getDetailedTasks) {
rti.baseIntent.replaceExtras((Bundle) null);
}
@@ -1715,12 +1715,15 @@ class RecentTasks {
/**
* Creates a new RecentTaskInfo from a TaskRecord.
*/
ActivityManager.RecentTaskInfo createRecentTaskInfo(TaskRecord tr) {
ActivityManager.RecentTaskInfo createRecentTaskInfo(TaskRecord tr, boolean getTasksAllowed) {
ActivityManager.RecentTaskInfo rti = new ActivityManager.RecentTaskInfo();
tr.fillTaskInfo(rti);
// Fill in some deprecated values
rti.id = rti.isRunning ? rti.taskId : INVALID_TASK_ID;
rti.persistentId = rti.taskId;
if (!getTasksAllowed) {
TaskRecord.trimIneffectiveInfo(tr, rti);
}
return rti;
}

View File

@@ -69,7 +69,7 @@ class RunningTasks {
}
final TaskRecord task = iter.next();
list.add(createRunningTaskInfo(task));
list.add(createRunningTaskInfo(task, allowed));
maxNum--;
}
}
@@ -77,11 +77,15 @@ class RunningTasks {
/**
* Constructs a {@link RunningTaskInfo} from a given {@param task}.
*/
private RunningTaskInfo createRunningTaskInfo(TaskRecord task) {
private RunningTaskInfo createRunningTaskInfo(TaskRecord task, boolean allowed) {
final RunningTaskInfo rti = new RunningTaskInfo();
task.fillTaskInfo(rti);
// Fill in some deprecated values
rti.id = rti.taskId;
if (!allowed) {
TaskRecord.trimIneffectiveInfo(task, rti);
}
return rti;
}
}

View File

@@ -2436,6 +2436,40 @@ class TaskRecord extends ConfigurationContainer {
info.configuration.setTo(getConfiguration());
}
/**
* Removes the activity info if the activity belongs to a different uid, which is
* different from the app that hosts the task.
*/
static void trimIneffectiveInfo(TaskRecord task, TaskInfo info) {
int topActivityUid = task.effectiveUid;
for (int i = task.mActivities.size() - 1; i >= 0; --i) {
final ActivityRecord r = task.mActivities.get(i);
if (r.finishing || r.isState(ActivityState.INITIALIZING)) {
continue;
}
topActivityUid = r.info.applicationInfo.uid;
break;
}
if (task.effectiveUid != topActivityUid) {
info.topActivity = null;
}
int baseActivityUid = task.effectiveUid;
for (int i = 0; i < task.mActivities.size(); ++i) {
final ActivityRecord r = task.mActivities.get(i);
if (r.finishing) {
continue;
}
baseActivityUid = r.info.applicationInfo.uid;
break;
}
if (task.effectiveUid != baseActivityUid) {
info.baseActivity = null;
}
}
/**
* Returns a {@link TaskInfo} with information from this task.
*/