From b51baa9ea47e93f85937ab1d7053cfd15594b4b3 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Fri, 8 Jul 2022 15:52:54 +0800 Subject: [PATCH] Avoid potential recursion of surface placement WindowSurfacePlacer#mInLayout can guard the case of calling RootWindowContainer#performSurfacePlacement recursively. But it requires the caller to use WindowSurfacePlacer instead of the inner method. Bug: 234840614 Bug: 237481770 Test: CtsWindowManagerDeviceTestCases Change-Id: Ie87646da2848cc988e3ea51644e86e2a88c2fd3a --- .../core/java/com/android/server/wm/RootWindowContainer.java | 4 ++++ .../core/java/com/android/server/wm/WindowManagerService.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index db730e0cb3689..e49870898f0f2 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -779,6 +779,10 @@ class RootWindowContainer extends WindowContainer return leakedSurface || killedApps; } + /** + * This method should only be called from {@link WindowSurfacePlacer}. Otherwise the recursion + * check and {@link WindowSurfacePlacer#isInLayout()} won't take effect. + */ void performSurfacePlacement() { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "performSurfacePlacement"); try { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index d31dfeed389d5..1f81cf313ac24 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -5611,7 +5611,7 @@ public class WindowManagerService extends IWindowManager.Stub mWindowsInsetsChanged = 0; // We need to update resizing windows and dispatch the new insets state // to them. - mRoot.performSurfacePlacement(); + mWindowPlacerLocked.performSurfacePlacement(); } } break;