Guard VirtualDevice#close by permission

If the permission is not already held by the caller through other means,
this causes unregistration failures, since the unique id disassociation
requires a signature permission. Clear the binding identity if the
permission is found, allowing use of the permisson. This is especially
important for CTS tests, and for access by non-signature apps.

Bug: 217275682
Test: atest CtsHardwareTestCases:android.hardware.input.cts.tests
Change-Id: Ide5232e5b5b5b1b3ca96e5cbfb997e4a1001a583
This commit is contained in:
Christine Franks
2022-02-02 09:21:26 -08:00
parent e429730809
commit 2a017cdc08
3 changed files with 13 additions and 2 deletions

View File

@@ -2754,7 +2754,7 @@ package android.companion.virtual {
public static class VirtualDeviceManager.VirtualDevice implements java.lang.AutoCloseable {
method public void addActivityListener(@NonNull android.companion.virtual.VirtualDeviceManager.ActivityListener);
method public void addActivityListener(@NonNull android.companion.virtual.VirtualDeviceManager.ActivityListener, @NonNull java.util.concurrent.Executor);
method public void close();
method @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void close();
method @Nullable public android.hardware.display.VirtualDisplay createVirtualDisplay(int, int, int, @Nullable android.view.Surface, int, @Nullable android.os.Handler, @Nullable android.hardware.display.VirtualDisplay.Callback);
method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualKeyboard createVirtualKeyboard(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int);
method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualMouse createVirtualMouse(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int);

View File

@@ -249,6 +249,7 @@ public final class VirtualDeviceManager {
* Closes the virtual device, stopping and tearing down any virtual displays,
* audio policies, and event injection that's currently in progress.
*/
@RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
public void close() {
try {
mVirtualDevice.close();

View File

@@ -212,6 +212,10 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
@Override // Binder call
public void close() {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CREATE_VIRTUAL_DEVICE,
"Permission required to close the virtual device");
synchronized (mVirtualDeviceLock) {
if (!mPerDisplayWakelocks.isEmpty()) {
mPerDisplayWakelocks.forEach((displayId, wakeLock) -> {
@@ -224,7 +228,13 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
}
mListener.onClose(mAssociationInfo.getId());
mAppToken.unlinkToDeath(this, 0);
mInputController.close();
final long token = Binder.clearCallingIdentity();
try {
mInputController.close();
} finally {
Binder.restoreCallingIdentity(token);
}
}
@Override