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

Commit 98261b47 authored by Songchun Fan's avatar Songchun Fan Committed by Song Chun Fan
Browse files

[MediaProjection] Fix package visibility check

getApplicationInfoAsUser should not be called after
clearCallingIdentity, otherwise the package visibility restrictions are
not applied.

BUG: 276936135
Test: atest
com.android.server.pm.test.appenumeration.AppEnumerationInternalTests#mediaProjectionManager_createProjection_cannotSeeTarget
Change-Id: I4325bf55aee7a658dbf7d7c86be76fcb443331df

Change-Id: I119fb86d0b1f06638e0d55aeebc1b092fd7a7f6b
parent 2fad91a2
Loading
Loading
Loading
Loading
+12 −15
Original line number Diff line number Diff line
@@ -357,13 +357,17 @@ public final class MediaProjectionManagerService extends SystemService
        } catch (NameNotFoundException e) {
            throw new IllegalArgumentException("No package matching :" + packageName);
        }

        final long callingToken = Binder.clearCallingIdentity();
        try {
            projection = new MediaProjection(type, uid, packageName, ai.targetSdkVersion,
                    ai.isPrivilegedApp());
            if (isPermanentGrant) {
                mAppOps.setMode(AppOpsManager.OP_PROJECT_MEDIA,
                        projection.uid, projection.packageName, AppOpsManager.MODE_ALLOWED);
            }
        } finally {
            Binder.restoreCallingIdentity(callingToken);
        }
        return projection;
    }

@@ -418,16 +422,9 @@ public final class MediaProjectionManagerService extends SystemService
            if (packageName == null || packageName.isEmpty()) {
                throw new IllegalArgumentException("package name must not be empty");
            }
            MediaProjection projection;
            final UserHandle callingUser = Binder.getCallingUserHandle();
            final long callingToken = Binder.clearCallingIdentity();
            try {
                projection = createProjectionInternal(uid, packageName, type, isPermanentGrant,
            return createProjectionInternal(uid, packageName, type, isPermanentGrant,
                    callingUser, false);
            } finally {
                Binder.restoreCallingIdentity(callingToken);
            }
            return projection;
        }

        @Override // Binder call