Loading core/java/android/hardware/usb/UsbDeviceConnection.java +28 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,34 @@ public class UsbDeviceConnection { } } /** * This is meant to be called by UsbRequest's queue() in order to synchronize on * UsbDeviceConnection's mLock to prevent the connection being closed while queueing. */ /* package */ boolean queueRequest(UsbRequest request, ByteBuffer buffer, int length) { synchronized (mLock) { if (!isOpen()) { return false; } return request.queueIfConnectionOpen(buffer, length); } } /** * This is meant to be called by UsbRequest's queue() in order to synchronize on * UsbDeviceConnection's mLock to prevent the connection being closed while queueing. */ /* package */ boolean queueRequest(UsbRequest request, @Nullable ByteBuffer buffer) { synchronized (mLock) { if (!isOpen()) { return false; } return request.queueIfConnectionOpen(buffer); } } /** * Releases all system resources related to the device. * Once the object is closed it cannot be used again. Loading core/java/android/hardware/usb/UsbRequest.java +58 −10 Original line number Diff line number Diff line Loading @@ -113,6 +113,7 @@ public class UsbRequest { * Releases all resources related to this request. */ public void close() { synchronized (mLock) { if (mNativeContext != 0) { mEndpoint = null; mConnection = null; Loading @@ -120,6 +121,7 @@ public class UsbRequest { mCloseGuard.close(); } } } @Override protected void finalize() throws Throwable { Loading Loading @@ -191,10 +193,32 @@ public class UsbRequest { */ @Deprecated public boolean queue(ByteBuffer buffer, int length) { UsbDeviceConnection connection = mConnection; if (connection == null) { // The expected exception by CTS Verifier - USB Device test throw new NullPointerException("invalid connection"); } // Calling into the underlying UsbDeviceConnection to synchronize on its lock, to prevent // the connection being closed while queueing. return connection.queueRequest(this, buffer, length); } /** * This is meant to be called from UsbDeviceConnection after synchronizing using the lock over * there, to prevent the connection being closed while queueing. */ /* package */ boolean queueIfConnectionOpen(ByteBuffer buffer, int length) { UsbDeviceConnection connection = mConnection; if (connection == null || !connection.isOpen()) { // The expected exception by CTS Verifier - USB Device test throw new NullPointerException("invalid connection"); } boolean out = (mEndpoint.getDirection() == UsbConstants.USB_DIR_OUT); boolean result; if (mConnection.getContext().getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.P if (connection.getContext().getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.P && length > MAX_USBFS_BUFFER_SIZE) { length = MAX_USBFS_BUFFER_SIZE; } Loading Loading @@ -243,6 +267,28 @@ public class UsbRequest { * @return true if the queueing operation succeeded */ public boolean queue(@Nullable ByteBuffer buffer) { UsbDeviceConnection connection = mConnection; if (connection == null) { // The expected exception by CTS Verifier - USB Device test throw new IllegalStateException("invalid connection"); } // Calling into the underlying UsbDeviceConnection to synchronize on its lock, to prevent // the connection being closed while queueing. return connection.queueRequest(this, buffer); } /** * This is meant to be called from UsbDeviceConnection after synchronizing using the lock over * there, to prevent the connection being closed while queueing. */ /* package */ boolean queueIfConnectionOpen(@Nullable ByteBuffer buffer) { UsbDeviceConnection connection = mConnection; if (connection == null || !connection.isOpen()) { // The expected exception by CTS Verifier - USB Device test throw new IllegalStateException("invalid connection"); } // Request need to be initialized Preconditions.checkState(mNativeContext != 0, "request is not initialized"); Loading @@ -260,7 +306,7 @@ public class UsbRequest { mIsUsingNewQueue = true; wasQueued = native_queue(null, 0, 0); } else { if (mConnection.getContext().getApplicationInfo().targetSdkVersion if (connection.getContext().getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.P) { // Can only send/receive MAX_USBFS_BUFFER_SIZE bytes at once Preconditions.checkArgumentInRange(buffer.remaining(), 0, MAX_USBFS_BUFFER_SIZE, Loading Loading @@ -363,11 +409,12 @@ public class UsbRequest { * @return true if cancelling succeeded */ public boolean cancel() { if (mConnection == null) { UsbDeviceConnection connection = mConnection; if (connection == null) { return false; } return mConnection.cancelRequest(this); return connection.cancelRequest(this); } /** Loading @@ -382,7 +429,8 @@ public class UsbRequest { * @return true if cancelling succeeded. */ /* package */ boolean cancelIfOpen() { if (mNativeContext == 0 || (mConnection != null && !mConnection.isOpen())) { UsbDeviceConnection connection = mConnection; if (mNativeContext == 0 || (connection != null && !connection.isOpen())) { Log.w(TAG, "Detected attempt to cancel a request on a connection which isn't open"); return false; Loading core/java/android/provider/Settings.java +20 −3 Original line number Diff line number Diff line Loading @@ -3344,9 +3344,26 @@ public final class Settings { } } Bundle b; // b/252663068: if we're in system server and the caller did not call // clearCallingIdentity, the read would fail due to mismatched AttributionSources. // TODO(b/256013480): remove this bypass after fixing the callers in system server. if (namespace.equals(DeviceConfig.NAMESPACE_DEVICE_POLICY_MANAGER) && Settings.isInSystemServer() && Binder.getCallingUid() != Process.myUid()) { final long token = Binder.clearCallingIdentity(); try { // Fetch all flags for the namespace at once for caching purposes b = cp.call(cr.getAttributionSource(), mProviderHolder.mUri.getAuthority(), mCallListCommand, null, args); } finally { Binder.restoreCallingIdentity(token); } } else { // Fetch all flags for the namespace at once for caching purposes Bundle b = cp.call(cr.getAttributionSource(), b = cp.call(cr.getAttributionSource(), mProviderHolder.mUri.getAuthority(), mCallListCommand, null, args); } if (b == null) { // Invalid response, return an empty map return keyValues; Loading core/java/com/android/internal/app/chooser/DisplayResolveInfo.java +2 −9 Original line number Diff line number Diff line Loading @@ -172,14 +172,14 @@ public class DisplayResolveInfo implements TargetInfo, Parcelable { @Override public boolean startAsCaller(ResolverActivity activity, Bundle options, int userId) { prepareIntentForCrossProfileLaunch(mResolvedIntent, userId); TargetInfo.prepareIntentForCrossProfileLaunch(mResolvedIntent, userId); activity.startActivityAsCaller(mResolvedIntent, options, false, userId); return true; } @Override public boolean startAsUser(Activity activity, Bundle options, UserHandle user) { prepareIntentForCrossProfileLaunch(mResolvedIntent, user.getIdentifier()); TargetInfo.prepareIntentForCrossProfileLaunch(mResolvedIntent, user.getIdentifier()); activity.startActivityAsUser(mResolvedIntent, options, user); return false; } Loading Loading @@ -224,13 +224,6 @@ public class DisplayResolveInfo implements TargetInfo, Parcelable { } }; private static void prepareIntentForCrossProfileLaunch(Intent intent, int targetUserId) { final int currentUserId = UserHandle.myUserId(); if (targetUserId != currentUserId) { intent.fixUris(currentUserId); } } private DisplayResolveInfo(Parcel in) { mDisplayLabel = in.readCharSequence(); mExtendedInfo = in.readCharSequence(); Loading core/java/com/android/internal/app/chooser/SelectableTargetInfo.java +1 −0 Original line number Diff line number Diff line Loading @@ -232,6 +232,7 @@ public final class SelectableTargetInfo implements ChooserTargetInfo { } intent.setComponent(mChooserTarget.getComponentName()); intent.putExtras(mChooserTarget.getIntentExtras()); TargetInfo.prepareIntentForCrossProfileLaunch(intent, userId); // Important: we will ignore the target security checks in ActivityManager // if and only if the ChooserTarget's target package is the same package Loading Loading
core/java/android/hardware/usb/UsbDeviceConnection.java +28 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,34 @@ public class UsbDeviceConnection { } } /** * This is meant to be called by UsbRequest's queue() in order to synchronize on * UsbDeviceConnection's mLock to prevent the connection being closed while queueing. */ /* package */ boolean queueRequest(UsbRequest request, ByteBuffer buffer, int length) { synchronized (mLock) { if (!isOpen()) { return false; } return request.queueIfConnectionOpen(buffer, length); } } /** * This is meant to be called by UsbRequest's queue() in order to synchronize on * UsbDeviceConnection's mLock to prevent the connection being closed while queueing. */ /* package */ boolean queueRequest(UsbRequest request, @Nullable ByteBuffer buffer) { synchronized (mLock) { if (!isOpen()) { return false; } return request.queueIfConnectionOpen(buffer); } } /** * Releases all system resources related to the device. * Once the object is closed it cannot be used again. Loading
core/java/android/hardware/usb/UsbRequest.java +58 −10 Original line number Diff line number Diff line Loading @@ -113,6 +113,7 @@ public class UsbRequest { * Releases all resources related to this request. */ public void close() { synchronized (mLock) { if (mNativeContext != 0) { mEndpoint = null; mConnection = null; Loading @@ -120,6 +121,7 @@ public class UsbRequest { mCloseGuard.close(); } } } @Override protected void finalize() throws Throwable { Loading Loading @@ -191,10 +193,32 @@ public class UsbRequest { */ @Deprecated public boolean queue(ByteBuffer buffer, int length) { UsbDeviceConnection connection = mConnection; if (connection == null) { // The expected exception by CTS Verifier - USB Device test throw new NullPointerException("invalid connection"); } // Calling into the underlying UsbDeviceConnection to synchronize on its lock, to prevent // the connection being closed while queueing. return connection.queueRequest(this, buffer, length); } /** * This is meant to be called from UsbDeviceConnection after synchronizing using the lock over * there, to prevent the connection being closed while queueing. */ /* package */ boolean queueIfConnectionOpen(ByteBuffer buffer, int length) { UsbDeviceConnection connection = mConnection; if (connection == null || !connection.isOpen()) { // The expected exception by CTS Verifier - USB Device test throw new NullPointerException("invalid connection"); } boolean out = (mEndpoint.getDirection() == UsbConstants.USB_DIR_OUT); boolean result; if (mConnection.getContext().getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.P if (connection.getContext().getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.P && length > MAX_USBFS_BUFFER_SIZE) { length = MAX_USBFS_BUFFER_SIZE; } Loading Loading @@ -243,6 +267,28 @@ public class UsbRequest { * @return true if the queueing operation succeeded */ public boolean queue(@Nullable ByteBuffer buffer) { UsbDeviceConnection connection = mConnection; if (connection == null) { // The expected exception by CTS Verifier - USB Device test throw new IllegalStateException("invalid connection"); } // Calling into the underlying UsbDeviceConnection to synchronize on its lock, to prevent // the connection being closed while queueing. return connection.queueRequest(this, buffer); } /** * This is meant to be called from UsbDeviceConnection after synchronizing using the lock over * there, to prevent the connection being closed while queueing. */ /* package */ boolean queueIfConnectionOpen(@Nullable ByteBuffer buffer) { UsbDeviceConnection connection = mConnection; if (connection == null || !connection.isOpen()) { // The expected exception by CTS Verifier - USB Device test throw new IllegalStateException("invalid connection"); } // Request need to be initialized Preconditions.checkState(mNativeContext != 0, "request is not initialized"); Loading @@ -260,7 +306,7 @@ public class UsbRequest { mIsUsingNewQueue = true; wasQueued = native_queue(null, 0, 0); } else { if (mConnection.getContext().getApplicationInfo().targetSdkVersion if (connection.getContext().getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.P) { // Can only send/receive MAX_USBFS_BUFFER_SIZE bytes at once Preconditions.checkArgumentInRange(buffer.remaining(), 0, MAX_USBFS_BUFFER_SIZE, Loading Loading @@ -363,11 +409,12 @@ public class UsbRequest { * @return true if cancelling succeeded */ public boolean cancel() { if (mConnection == null) { UsbDeviceConnection connection = mConnection; if (connection == null) { return false; } return mConnection.cancelRequest(this); return connection.cancelRequest(this); } /** Loading @@ -382,7 +429,8 @@ public class UsbRequest { * @return true if cancelling succeeded. */ /* package */ boolean cancelIfOpen() { if (mNativeContext == 0 || (mConnection != null && !mConnection.isOpen())) { UsbDeviceConnection connection = mConnection; if (mNativeContext == 0 || (connection != null && !connection.isOpen())) { Log.w(TAG, "Detected attempt to cancel a request on a connection which isn't open"); return false; Loading
core/java/android/provider/Settings.java +20 −3 Original line number Diff line number Diff line Loading @@ -3344,9 +3344,26 @@ public final class Settings { } } Bundle b; // b/252663068: if we're in system server and the caller did not call // clearCallingIdentity, the read would fail due to mismatched AttributionSources. // TODO(b/256013480): remove this bypass after fixing the callers in system server. if (namespace.equals(DeviceConfig.NAMESPACE_DEVICE_POLICY_MANAGER) && Settings.isInSystemServer() && Binder.getCallingUid() != Process.myUid()) { final long token = Binder.clearCallingIdentity(); try { // Fetch all flags for the namespace at once for caching purposes b = cp.call(cr.getAttributionSource(), mProviderHolder.mUri.getAuthority(), mCallListCommand, null, args); } finally { Binder.restoreCallingIdentity(token); } } else { // Fetch all flags for the namespace at once for caching purposes Bundle b = cp.call(cr.getAttributionSource(), b = cp.call(cr.getAttributionSource(), mProviderHolder.mUri.getAuthority(), mCallListCommand, null, args); } if (b == null) { // Invalid response, return an empty map return keyValues; Loading
core/java/com/android/internal/app/chooser/DisplayResolveInfo.java +2 −9 Original line number Diff line number Diff line Loading @@ -172,14 +172,14 @@ public class DisplayResolveInfo implements TargetInfo, Parcelable { @Override public boolean startAsCaller(ResolverActivity activity, Bundle options, int userId) { prepareIntentForCrossProfileLaunch(mResolvedIntent, userId); TargetInfo.prepareIntentForCrossProfileLaunch(mResolvedIntent, userId); activity.startActivityAsCaller(mResolvedIntent, options, false, userId); return true; } @Override public boolean startAsUser(Activity activity, Bundle options, UserHandle user) { prepareIntentForCrossProfileLaunch(mResolvedIntent, user.getIdentifier()); TargetInfo.prepareIntentForCrossProfileLaunch(mResolvedIntent, user.getIdentifier()); activity.startActivityAsUser(mResolvedIntent, options, user); return false; } Loading Loading @@ -224,13 +224,6 @@ public class DisplayResolveInfo implements TargetInfo, Parcelable { } }; private static void prepareIntentForCrossProfileLaunch(Intent intent, int targetUserId) { final int currentUserId = UserHandle.myUserId(); if (targetUserId != currentUserId) { intent.fixUris(currentUserId); } } private DisplayResolveInfo(Parcel in) { mDisplayLabel = in.readCharSequence(); mExtendedInfo = in.readCharSequence(); Loading
core/java/com/android/internal/app/chooser/SelectableTargetInfo.java +1 −0 Original line number Diff line number Diff line Loading @@ -232,6 +232,7 @@ public final class SelectableTargetInfo implements ChooserTargetInfo { } intent.setComponent(mChooserTarget.getComponentName()); intent.putExtras(mChooserTarget.getIntentExtras()); TargetInfo.prepareIntentForCrossProfileLaunch(intent, userId); // Important: we will ignore the target security checks in ActivityManager // if and only if the ChooserTarget's target package is the same package Loading