From fe5a3e509b872dce1128d7be844f3d88a974d11f Mon Sep 17 00:00:00 2001 From: Cliff Wu Date: Wed, 9 Feb 2022 23:11:13 +0800 Subject: [PATCH] Add a lock to protect mRunningUids in GenericWindowPolicyController - Open the camera on the virtual display and immediately use CameraAccessController's isAppRunningOnAnyVirtualDevice to judge, it may cause race conditions in onRunningAppsChanged() and containsUid(), making the result incorrect. Bug: 218400882 Test: Manual Change-Id: I61fc436da96b007614db2c8f0a10cf060462138c --- .../GenericWindowPolicyController.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java index 4afa96c8072d1..bc1f28d1c373b 100644 --- a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +++ b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java @@ -37,6 +37,7 @@ import android.util.Slog; import android.view.Display; import android.window.DisplayWindowPolicyController; +import com.android.internal.annotations.GuardedBy; import com.android.internal.app.BlockedAppStreamingActivity; import java.util.List; @@ -75,9 +76,11 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController private final ArraySet mAllowedActivities; @Nullable private final ArraySet mBlockedActivities; + private final Object mGenericWindowPolicyControllerLock = new Object(); private Consumer mActivityBlockedCallback; @NonNull + @GuardedBy("mGenericWindowPolicyControllerLock") final ArraySet mRunningUids = new ArraySet<>(); @Nullable private final ActivityListener mActivityListener; private final Handler mHandler = new Handler(Looper.getMainLooper()); @@ -149,11 +152,13 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @Override public void onRunningAppsChanged(ArraySet runningUids) { - mRunningUids.clear(); - mRunningUids.addAll(runningUids); - if (mActivityListener != null && mRunningUids.isEmpty()) { - // Post callback on the main thread so it doesn't block activity launching - mHandler.post(() -> mActivityListener.onDisplayEmpty(Display.INVALID_DISPLAY)); + synchronized (mGenericWindowPolicyControllerLock) { + mRunningUids.clear(); + mRunningUids.addAll(runningUids); + if (mActivityListener != null && mRunningUids.isEmpty()) { + // Post callback on the main thread so it doesn't block activity launching + mHandler.post(() -> mActivityListener.onDisplayEmpty(Display.INVALID_DISPLAY)); + } } if (mRunningAppsChangedListener != null) { mRunningAppsChangedListener.onRunningAppsChanged(runningUids); @@ -165,7 +170,9 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController * this controller. */ boolean containsUid(int uid) { - return mRunningUids.contains(uid); + synchronized (mGenericWindowPolicyControllerLock) { + return mRunningUids.contains(uid); + } } private boolean canContainActivity(ActivityInfo activityInfo, int windowFlags,