diff options
| author | Tetsutoki Shiozawa <tetsutoki.shiozawa@sony.com> | 2017-11-01 11:38:34 +0900 |
|---|---|---|
| committer | Takamasa Kuramitsu <takamasa.kuramitsu@sony.com> | 2017-11-08 16:46:09 +0900 |
| commit | 978e7f87cc0c1d2ff140694ec150c8eca10bfee6 (patch) | |
| tree | 065cc61e9fa10a7b28ccb9cf979bdc8e1d65da19 /core/java/android/view/WindowManagerGlobal.java | |
| parent | ee56b4a65c4fcaf512137a8c97410cee34661630 (diff) | |
Fix: WindowManagerGlobal#setStoppedState failed by IOOBE
Symptom:
An application crashed due to IndexOutOfBoundsException.
The exception was thrown at WindowManagerGlobal#setStoppedState.
Root cause:
setStoppedState invokes setWindowStopped for each ViewRoot by
ascending order. If an application removes its view within the
loop, loop index exceeds the number of items.
Solution:
Loop in descending order.
Bug: 69018607
Change-Id: I7e20282dc99b767912be4e00d81ffb49fe6c7ac0
Diffstat (limited to 'core/java/android/view/WindowManagerGlobal.java')
| -rw-r--r-- | core/java/android/view/WindowManagerGlobal.java | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java index c7e8dee3da83..cca66d6b8ae0 100644 --- a/core/java/android/view/WindowManagerGlobal.java +++ b/core/java/android/view/WindowManagerGlobal.java @@ -605,9 +605,10 @@ public final class WindowManagerGlobal { public void setStoppedState(IBinder token, boolean stopped) { synchronized (mLock) { int count = mViews.size(); - for (int i = 0; i < count; i++) { + for (int i = count - 1; i >= 0; i--) { if (token == null || mParams.get(i).token == token) { ViewRootImpl root = mRoots.get(i); + // Client might remove the view by "stopped" event. root.setWindowStopped(stopped); } } |
