Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fc8f9637 authored by Tiger Huang's avatar Tiger Huang
Browse files

Always copy sources to outInsetsState before writeToParcel

InsetsState#writeToParcel is executed outside of mGlobalLock, so there
could be two threads accessing the same object at the same time. This CL
copies sources to outInsetsState to prevent the race condition.

Fix: 235019713
Fix: 242037615
Test: presubmit
Change-Id: I78d9b89f88f75ab673761bbfce86330ff0163adc
parent 81ae4109
Loading
Loading
Loading
Loading
+4 −7
Original line number Diff line number Diff line
@@ -1866,7 +1866,7 @@ public class WindowManagerService extends IWindowManager.Stub
            displayContent.getInsetsStateController().updateAboveInsetsState(
                    false /* notifyInsetsChanged */);

            outInsetsState.set(win.getCompatInsetsState(), win.isClientLocal());
            outInsetsState.set(win.getCompatInsetsState(), true /* copySources */);
            getInsetsSourceControls(win, outActiveControls);

            if (win.mLayoutAttached) {
@@ -2560,7 +2560,7 @@ public class WindowManagerService extends IWindowManager.Stub
            }

            if (outInsetsState != null) {
                outInsetsState.set(win.getCompatInsetsState(), win.isClientLocal());
                outInsetsState.set(win.getCompatInsetsState(), true /* copySources */);
            }

            ProtoLog.v(WM_DEBUG_FOCUS, "Relayout of %s: focusMayChange=%b",
@@ -8877,7 +8877,6 @@ public class WindowManagerService extends IWindowManager.Stub
    @Override
    public boolean getWindowInsets(WindowManager.LayoutParams attrs, int displayId,
            InsetsState outInsetsState) {
        final boolean fromLocal = Binder.getCallingPid() == MY_PID;
        final int uid = Binder.getCallingUid();
        final long origId = Binder.clearCallingIdentity();
        try {
@@ -8891,10 +8890,8 @@ public class WindowManagerService extends IWindowManager.Stub
                final float overrideScale = mAtmService.mCompatModePackages.getCompatScale(
                        attrs.packageName, uid);
                final InsetsState state = dc.getInsetsPolicy().getInsetsForWindowMetrics(attrs);
                final boolean hasCompatScale =
                        WindowState.hasCompatScale(attrs, token, overrideScale);
                outInsetsState.set(state, hasCompatScale || fromLocal);
                if (hasCompatScale) {
                outInsetsState.set(state, true /* copySources */);
                if (WindowState.hasCompatScale(attrs, token, overrideScale)) {
                    final float compatScale = token != null && token.hasSizeCompatBounds()
                            ? token.getSizeCompatScale() * overrideScale
                            : overrideScale;