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

Commit 4e530d3b authored by Naomi Musgrave's avatar Naomi Musgrave
Browse files

WMS retrieves uid for the package based on the linux user

Without this, checking if the caller is the recents component always
fails on the secondary user.

Bug: 254937640
Test: atest WmTests:WindowManagerServiceTests
Change-Id: Iac9fea3935c3aadf29a21d8af715df845e8ea43c
parent b996c643
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -738,9 +738,8 @@ interface IWindowManager
     * If invoked through a package other than a launcher app, returns an empty list.
     *
     * @param displayId the id of the logical display
     * @param packageName the name of the calling package
     */
    List<DisplayInfo> getPossibleDisplayInfo(int displayId, String packageName);
    List<DisplayInfo> getPossibleDisplayInfo(int displayId);

    /**
     * Called to show global actions.
+1 −1
Original line number Diff line number Diff line
@@ -366,7 +366,7 @@ public final class WindowManagerImpl implements WindowManager {
        List<DisplayInfo> possibleDisplayInfos;
        try {
            possibleDisplayInfos = WindowManagerGlobal.getWindowManagerService()
                    .getPossibleDisplayInfo(displayId, mContext.getPackageName());
                    .getPossibleDisplayInfo(displayId);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
+4 −29
Original line number Diff line number Diff line
@@ -8940,14 +8940,14 @@ public class WindowManagerService extends IWindowManager.Stub
    }

    @Override
    public List<DisplayInfo> getPossibleDisplayInfo(int displayId, String packageName) {
    public List<DisplayInfo> getPossibleDisplayInfo(int displayId) {
        final int callingUid = Binder.getCallingUid();
        final long origId = Binder.clearCallingIdentity();
        try {
            synchronized (mGlobalLock) {
                if (packageName == null || !isRecentsComponent(packageName, callingUid)) {
                    Slog.e(TAG, "Unable to verify uid for package " + packageName
                            + " for getPossibleMaximumWindowMetrics");
                if (!mAtmService.isCallerRecents(callingUid)) {
                    Slog.e(TAG, "Unable to verify uid for getPossibleDisplayInfo"
                            + " on uid " + callingUid);
                    return new ArrayList<>();
                }

@@ -8965,31 +8965,6 @@ public class WindowManagerService extends IWindowManager.Stub
        return mPossibleDisplayInfoMapper.getPossibleDisplayInfos(displayId);
    }

    /**
     * Returns {@code true} when the calling package is the recents component.
     */
    boolean isRecentsComponent(@NonNull String callingPackageName, int callingUid) {
        String recentsPackage;
        try {
            String recentsComponent = mContext.getResources().getString(
                    R.string.config_recentsComponentName);
            if (recentsComponent == null) {
                return false;
            }
            recentsPackage = ComponentName.unflattenFromString(recentsComponent).getPackageName();
        } catch (Resources.NotFoundException e) {
            Slog.e(TAG, "Unable to verify if recents component", e);
            return false;
        }
        try {
            return callingUid == mContext.getPackageManager().getPackageUid(callingPackageName, 0)
                    && callingPackageName.equals(recentsPackage);
        } catch (PackageManager.NameNotFoundException e) {
            Slog.e(TAG, "Unable to verify if recents component", e);
            return false;
        }
    }

    void grantEmbeddedWindowFocus(Session session, IBinder focusToken, boolean grantFocus) {
        synchronized (mGlobalLock) {
            final EmbeddedWindowController.EmbeddedWindow embeddedWindow =