summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <treehugger-gerrit@google.com> 2020-12-02 23:43:52 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2020-12-02 23:43:52 +0000
commit182b4163ca12c5bce84dd6e4b3f07eb17afc2320 (patch)
tree60cd36ba7283b7c9cedce580ca0509d54d103bd8
parent6948e0026ebd136bc571d89899a9a5d861684cc7 (diff)
parent839fca8ad50569c0efc8af43fa7c0c64d1a48630 (diff)
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
-rwxr-xr-xservices/core/java/com/android/server/tv/TvInputManagerService.java11
1 files changed, 10 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java
index 323ac7b8806e..bedcf9c45139 100755
--- a/services/core/java/com/android/server/tv/TvInputManagerService.java
+++ b/services/core/java/com/android/server/tv/TvInputManagerService.java
@@ -714,6 +714,7 @@ public final class TvInputManagerService extends SystemService {
SessionState sessionState = userState.sessionStateMap.remove(sessionToken);
if (sessionState == null) {
+ Slog.e(TAG, "sessionState null, no more remove session action!");
return;
}
@@ -2278,8 +2279,16 @@ public final class TvInputManagerService extends SystemService {
ClientState clientState = userState.clientStateMap.get(clientToken);
if (clientState != null) {
while (clientState.sessionTokens.size() > 0) {
+ IBinder sessionToken = clientState.sessionTokens.get(0);
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;