Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(410)

Unified Diff: device/usb/mojo/device_impl.cc

Issue 1847183002: Use interface associations to check function permissions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed nit and fixed Windows build. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « device/usb/mock_usb_device_handle.h ('k') | device/usb/mojo/device_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: device/usb/mojo/device_impl.cc
diff --git a/device/usb/mojo/device_impl.cc b/device/usb/mojo/device_impl.cc
index a2dd316f3471fe7a2a21ada55bfa5a52f0329c41..2dee0338f8885e1d2012cb10caeb020f550bee34 100644
--- a/device/usb/mojo/device_impl.cc
+++ b/device/usb/mojo/device_impl.cc
@@ -165,15 +165,23 @@ bool DeviceImpl::HasControlTransferPermission(
if (!config)
return false;
- uint8_t interface_number = index & 0xff;
- if (recipient == ControlTransferRecipient::ENDPOINT &&
- !device_handle_->FindInterfaceByEndpoint(index & 0xff,
- &interface_number)) {
- return false;
+ const UsbInterfaceDescriptor* interface = nullptr;
+ if (recipient == ControlTransferRecipient::ENDPOINT) {
+ interface = device_handle_->FindInterfaceByEndpoint(index & 0xff);
+ } else {
+ auto interface_it =
+ std::find_if(config->interfaces.begin(), config->interfaces.end(),
+ [index](const UsbInterfaceDescriptor& this_iface) {
+ return this_iface.interface_number == (index & 0xff);
+ });
+ if (interface_it != config->interfaces.end())
+ interface = &*interface_it;
}
+ if (interface == nullptr)
+ return false;
- return permission_provider_->HasInterfacePermission(
- interface_number, config->configuration_value, *device_info_);
+ return permission_provider_->HasFunctionPermission(
+ interface->first_interface, config->configuration_value, *device_info_);
} else if (config) {
return permission_provider_->HasConfigurationPermission(
config->configuration_value, *device_info_);
@@ -236,9 +244,20 @@ void DeviceImpl::ClaimInterface(uint8_t interface_number,
return;
}
+ auto interface_it =
+ std::find_if(config->interfaces.begin(), config->interfaces.end(),
+ [interface_number](const UsbInterfaceDescriptor& interface) {
+ return interface.interface_number == interface_number;
+ });
+ if (interface_it == config->interfaces.end()) {
+ callback.Run(false);
+ return;
+ }
+
if (permission_provider_ &&
- permission_provider_->HasInterfacePermission(
- interface_number, config->configuration_value, *device_info_)) {
+ permission_provider_->HasFunctionPermission(interface_it->first_interface,
+ config->configuration_value,
+ *device_info_)) {
device_handle_->ClaimInterface(interface_number,
WrapMojoCallback(callback));
} else {
« no previous file with comments | « device/usb/mock_usb_device_handle.h ('k') | device/usb/mojo/device_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698