Merge "SystemServer: fix an infinite loop in TvInputManagerService [1/1]" am: deb1024b75 am: 839fca8ad5

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

Change-Id: Idcd8114385be347e2f111d836200cf1f81f51ebd
This commit is contained in:
Treehugger Robot
2020-12-02 23:43:52 +00:00
committed by Automerger Merge Worker

View File

@@ -714,6 +714,7 @@ public final class TvInputManagerService extends SystemService {
SessionState sessionState = userState.sessionStateMap.remove(sessionToken); SessionState sessionState = userState.sessionStateMap.remove(sessionToken);
if (sessionState == null) { if (sessionState == null) {
Slog.e(TAG, "sessionState null, no more remove session action!");
return; return;
} }
@@ -2278,8 +2279,16 @@ public final class TvInputManagerService extends SystemService {
ClientState clientState = userState.clientStateMap.get(clientToken); ClientState clientState = userState.clientStateMap.get(clientToken);
if (clientState != null) { if (clientState != null) {
while (clientState.sessionTokens.size() > 0) { while (clientState.sessionTokens.size() > 0) {
IBinder sessionToken = clientState.sessionTokens.get(0);
releaseSessionLocked( releaseSessionLocked(
clientState.sessionTokens.get(0), Process.SYSTEM_UID, userId); sessionToken, Process.SYSTEM_UID, userId);
// the releaseSessionLocked function may return before the sessionToken
// is removed if the related sessionState is null. So need to check again
// to avoid death curculation.
if (clientState.sessionTokens.contains(sessionToken)) {
Slog.d(TAG, "remove sessionToken " + sessionToken + " for " + clientToken);
clientState.sessionTokens.remove(sessionToken);
}
} }
} }
clientToken = null; clientToken = null;