summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Monk <jmonk@google.com>2015-06-19 15:31:59 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-06-19 15:32:06 +0000
commit1247e48e0262ea9ac807bbd0e0939dc0450cd6ab (patch)
tree56d319a8a1696edf71c36e1e6a2c77ce582d06cb
parent7e786954e5821ad00335fae5d9c492c855631099 (diff)
parent25d237b8ea8f573c1d6c27f7d9e87b5ebd5b5429 (diff)
downloadframeworks_base-1247e48e0262ea9ac807bbd0e0939dc0450cd6ab.zip
frameworks_base-1247e48e0262ea9ac807bbd0e0939dc0450cd6ab.tar.gz
frameworks_base-1247e48e0262ea9ac807bbd0e0939dc0450cd6ab.tar.bz2
Merge "Fix security whole in lock task" into mnc-dev
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java13
1 files changed, 11 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 9e33f2a..4e98576 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -1915,7 +1915,12 @@ public final class ActivityStackSupervisor implements DisplayListener {
ActivityRecord intentActivity = !launchSingleInstance ?
findTaskLocked(r) : findActivityLocked(intent, r.info);
if (intentActivity != null) {
- if (isLockTaskModeViolation(intentActivity.task)) {
+ // When the flags NEW_TASK and CLEAR_TASK are set, then the task gets reused
+ // but still needs to be a lock task mode violation since the task gets
+ // cleared out and the device would otherwise leave the locked task.
+ if (isLockTaskModeViolation(intentActivity.task,
+ (launchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))
+ == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))) {
showLockTaskToast();
Slog.e(TAG, "startActivityUnchecked: Attempt to violate Lock Task Mode");
return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
@@ -3780,7 +3785,11 @@ public final class ActivityStackSupervisor implements DisplayListener {
}
boolean isLockTaskModeViolation(TaskRecord task) {
- if (getLockedTaskLocked() == task) {
+ return isLockTaskModeViolation(task, false);
+ }
+
+ boolean isLockTaskModeViolation(TaskRecord task, boolean isNewClearTask) {
+ if (getLockedTaskLocked() == task && !isNewClearTask) {
return false;
}
final int lockTaskAuth = task.mLockTaskAuth;