Fix timer bug in TrustManagerService.

Previously, anytime a device was unlocked, we would refresh the trustable timers. Now, we should ensure that there actually is a trustable timer running before refreshing (since updating trust will start it anyways). We also make sure to destroy the timers when we move to UNTRUSTED

Fixes:273550297
Fixes:264684930
Change-Id: I75d58e09848d4123bb55ea9a36cab739504ca6e8
Test: Tested that this fixes 273550297 by justinkchung@
This commit is contained in:
Jacob Hobbie
2023-03-30 22:44:39 +00:00
parent cfbdee1159
commit c539a470cb

View File

@@ -393,6 +393,23 @@ public class TrustManagerService extends SystemService {
true /* overrideHardTimeout */);
}
private void cancelBothTrustableAlarms(int userId) {
TrustableTimeoutAlarmListener idleTimeout =
mIdleTrustableTimeoutAlarmListenerForUser.get(
userId);
TrustableTimeoutAlarmListener trustableTimeout =
mTrustableTimeoutAlarmListenerForUser.get(
userId);
if (idleTimeout != null && idleTimeout.isQueued()) {
idleTimeout.setQueued(false);
mAlarmManager.cancel(idleTimeout);
}
if (trustableTimeout != null && trustableTimeout.isQueued()) {
trustableTimeout.setQueued(false);
mAlarmManager.cancel(trustableTimeout);
}
}
private void handleScheduleTrustedTimeout(int userId, boolean shouldOverride) {
long when = SystemClock.elapsedRealtime() + TRUST_TIMEOUT_IN_MILLIS;
TrustedTimeoutAlarmListener alarm = mTrustTimeoutAlarmListenerForUser.get(userId);
@@ -657,6 +674,11 @@ public class TrustManagerService extends SystemService {
resultCallback.complete(new GrantTrustResult(STATUS_UNLOCKED_BY_GRANT));
}
}
if ((wasTrusted || wasTrustable) && pendingTrustState == TrustState.UNTRUSTED) {
if (DEBUG) Slog.d(TAG, "Trust was revoked, destroy trustable alarms");
cancelBothTrustableAlarms(userId);
}
}
private void updateTrustUsuallyManaged(int userId, boolean managed) {
@@ -1908,7 +1930,11 @@ public class TrustManagerService extends SystemService {
handleScheduleTrustTimeout(shouldOverride, timeoutType);
break;
case MSG_REFRESH_TRUSTABLE_TIMERS_AFTER_AUTH:
refreshTrustableTimers(msg.arg1);
TrustableTimeoutAlarmListener trustableAlarm =
mTrustableTimeoutAlarmListenerForUser.get(msg.arg1);
if (trustableAlarm != null && trustableAlarm.isQueued()) {
refreshTrustableTimers(msg.arg1);
}
break;
}
}
@@ -2160,7 +2186,7 @@ public class TrustManagerService extends SystemService {
TrustedTimeoutAlarmListener otherAlarm;
boolean otherAlarmPresent;
if (ENABLE_ACTIVE_UNLOCK_FLAG) {
cancelBothTrustableAlarms();
cancelBothTrustableAlarms(mUserId);
otherAlarm = mTrustTimeoutAlarmListenerForUser.get(mUserId);
otherAlarmPresent = (otherAlarm != null) && otherAlarm.isQueued();
if (otherAlarmPresent) {
@@ -2172,23 +2198,6 @@ public class TrustManagerService extends SystemService {
}
}
private void cancelBothTrustableAlarms() {
TrustableTimeoutAlarmListener idleTimeout =
mIdleTrustableTimeoutAlarmListenerForUser.get(
mUserId);
TrustableTimeoutAlarmListener trustableTimeout =
mTrustableTimeoutAlarmListenerForUser.get(
mUserId);
if (idleTimeout != null && idleTimeout.isQueued()) {
idleTimeout.setQueued(false);
mAlarmManager.cancel(idleTimeout);
}
if (trustableTimeout != null && trustableTimeout.isQueued()) {
trustableTimeout.setQueued(false);
mAlarmManager.cancel(trustableTimeout);
}
}
private void disableRenewableTrustWhileNonrenewableTrustIsPresent() {
// if non-renewable trust is running, we need to temporarily prevent
// renewable trust from being used