summaryrefslogtreecommitdiffstats
path: root/device
diff options
context:
space:
mode:
authorgab <gab@chromium.org>2016-02-14 14:08:54 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-14 22:10:31 +0000
commit894ae258c08e0b531cefcf6167d9d189d44d26e0 (patch)
tree57a768c0ec714c29a648aa5f8ac0e228806b3463 /device
parentd4abba4717ef1dfce402c12b51e1e5b11c64d776 (diff)
downloadchromium_src-894ae258c08e0b531cefcf6167d9d189d44d26e0.zip
chromium_src-894ae258c08e0b531cefcf6167d9d189d44d26e0.tar.gz
chromium_src-894ae258c08e0b531cefcf6167d9d189d44d26e0.tar.bz2
Revert of Parse USB interface association descriptors. (patchset #3 id:100001 of https://codereview.chromium.org/1568673002/ )
Reason for revert: http://crbug.com/586824 Makes Chrome hang when using USB devices. Original issue's description: > Parse USB interface association descriptors. > > USB interface association descriptors are used to combine multiple > interfaces into a single functional group. This patch adds support for > parsing them out of the |extra_data| field left by libusb's parsing of > configuration, interface and endpoint descriptors. The resulting > association is then represented by setting the |first_interface| field > of each interface in a function to the |interface_number| of the first > interface in the function. > > WebUSB will use these associations to set permissions for an entire > function with a single descriptor. > TBR=rockot@chromium.org,pfeldman@chromium.org,stevenjb@chromium.org,reillyg@chromium.org # Not skipping CQ checks because original CL landed more than 1 days ago. BUG=492204, 586824 Review URL: https://codereview.chromium.org/1697863003 Cr-Commit-Position: refs/heads/master@{#375392}
Diffstat (limited to 'device')
-rw-r--r--device/usb/usb_descriptors.cc81
-rw-r--r--device/usb/usb_descriptors.h6
-rw-r--r--device/usb/usb_descriptors_unittest.cc75
-rw-r--r--device/usb/usb_device_impl.cc2
4 files changed, 1 insertions, 163 deletions
diff --git a/device/usb/usb_descriptors.cc b/device/usb/usb_descriptors.cc
index 22414d7..6defda8 100644
--- a/device/usb/usb_descriptors.cc
+++ b/device/usb/usb_descriptors.cc
@@ -7,7 +7,6 @@
#include <stddef.h>
#include <algorithm>
-#include <vector>
#include "base/barrier_closure.h"
#include "base/bind.h"
@@ -27,42 +26,6 @@ const uint8_t kStringDescriptorType = 0x03;
const int kControlTransferTimeout = 60000; // 1 minute
-struct UsbInterfaceAssociationDescriptor {
- UsbInterfaceAssociationDescriptor(uint8_t first_interface,
- uint8_t interface_count)
- : first_interface(first_interface), interface_count(interface_count) {}
-
- bool operator<(const UsbInterfaceAssociationDescriptor& other) const {
- return first_interface < other.first_interface;
- }
-
- uint8_t first_interface;
- uint8_t interface_count;
-};
-
-void ParseInterfaceAssociationDescriptors(
- const std::vector<uint8_t>& buffer,
- std::vector<UsbInterfaceAssociationDescriptor>* functions) {
- const uint8_t kInterfaceAssociationDescriptorType = 11;
- const uint8_t kInterfaceAssociationDescriptorLength = 8;
- std::vector<uint8_t>::const_iterator it = buffer.begin();
-
- while (it != buffer.end()) {
- // All descriptors must be at least 2 byte which means the length and type
- // are safe to read.
- if (std::distance(it, buffer.end()) < 2)
- return;
- uint8_t length = it[0];
- if (length > std::distance(it, buffer.end()))
- return;
- if (it[1] == kInterfaceAssociationDescriptorType &&
- length == kInterfaceAssociationDescriptorLength) {
- functions->push_back(UsbInterfaceAssociationDescriptor(it[2], it[3]));
- }
- std::advance(it, length);
- }
-}
-
void StoreStringDescriptor(IndexMap::iterator it,
const base::Closure& callback,
const base::string16& string) {
@@ -150,8 +113,7 @@ UsbInterfaceDescriptor::UsbInterfaceDescriptor(uint8_t interface_number,
alternate_setting(alternate_setting),
interface_class(interface_class),
interface_subclass(interface_subclass),
- interface_protocol(interface_protocol),
- first_interface(interface_number) {}
+ interface_protocol(interface_protocol) {}
UsbInterfaceDescriptor::~UsbInterfaceDescriptor() = default;
@@ -166,47 +128,6 @@ UsbConfigDescriptor::UsbConfigDescriptor(uint8_t configuration_value,
UsbConfigDescriptor::~UsbConfigDescriptor() = default;
-void UsbConfigDescriptor::AssignFirstInterfaceNumbers() {
- std::vector<UsbInterfaceAssociationDescriptor> functions;
- ParseInterfaceAssociationDescriptors(extra_data, &functions);
- for (const auto& interface : interfaces) {
- ParseInterfaceAssociationDescriptors(interface.extra_data, &functions);
- for (const auto& endpoint : interface.endpoints)
- ParseInterfaceAssociationDescriptors(endpoint.extra_data, &functions);
- }
-
- // libusb has collected interface association descriptors in the |extra_data|
- // fields of other descriptor types. This may have disturbed their order
- // but sorting by the bFirstInterface should fix it.
- std::sort(functions.begin(), functions.end());
-
- uint8_t remaining_interfaces = 0;
- auto function_it = functions.cbegin();
- for (auto interface_it = interfaces.begin(); interface_it != interfaces.end();
- ++interface_it) {
- if (remaining_interfaces > 0) {
- // Continuation of a previous function. Tag all alternate interfaces
- // (which are guaranteed to be contiguous).
- for (uint8_t interface_number = interface_it->interface_number;
- interface_it != interfaces.end() &&
- interface_it->interface_number == interface_number;
- ++interface_it) {
- interface_it->first_interface = function_it->first_interface;
- }
- if (--remaining_interfaces == 0)
- ++function_it;
- } else if (function_it != functions.end() &&
- interface_it->interface_number == function_it->first_interface) {
- // Start of a new function.
- interface_it->first_interface = function_it->first_interface;
- remaining_interfaces = function_it->interface_count - 1;
- } else {
- // Unassociated interfaces already have |first_interface| set to
- // |interface_number|.
- }
- }
-}
-
bool ParseUsbStringDescriptor(const std::vector<uint8_t>& descriptor,
base::string16* output) {
if (descriptor.size() < 2 || descriptor[1] != kStringDescriptorType)
diff --git a/device/usb/usb_descriptors.h b/device/usb/usb_descriptors.h
index a1414154..c99a6de 100644
--- a/device/usb/usb_descriptors.h
+++ b/device/usb/usb_descriptors.h
@@ -85,8 +85,6 @@ struct UsbInterfaceDescriptor {
uint8_t interface_protocol;
std::vector<UsbEndpointDescriptor> endpoints;
std::vector<uint8_t> extra_data;
- // First interface of the function to which this interface belongs.
- uint8_t first_interface;
};
struct UsbConfigDescriptor {
@@ -97,10 +95,6 @@ struct UsbConfigDescriptor {
UsbConfigDescriptor() = delete;
~UsbConfigDescriptor();
- // Scans through |extra_data| for interface association descriptors and
- // populates |first_interface| for each interface in this configuration.
- void AssignFirstInterfaceNumbers();
-
uint8_t configuration_value;
bool self_powered;
bool remote_wakeup;
diff --git a/device/usb/usb_descriptors_unittest.cc b/device/usb/usb_descriptors_unittest.cc
index 5bc2943..402304f 100644
--- a/device/usb/usb_descriptors_unittest.cc
+++ b/device/usb/usb_descriptors_unittest.cc
@@ -32,81 +32,6 @@ void ExpectStringDescriptors(
class UsbDescriptorsTest : public ::testing::Test {};
-TEST_F(UsbDescriptorsTest, NoInterfaceAssociations) {
- UsbConfigDescriptor config(1, false, false, 0);
- config.interfaces.emplace_back(0, 0, 255, 255, 255);
- config.interfaces.emplace_back(0, 1, 255, 255, 255);
- config.interfaces.emplace_back(1, 0, 255, 255, 255);
- config.AssignFirstInterfaceNumbers();
-
- EXPECT_EQ(0, config.interfaces[0].first_interface);
- EXPECT_EQ(0, config.interfaces[1].first_interface);
- EXPECT_EQ(1, config.interfaces[2].first_interface);
-}
-
-TEST_F(UsbDescriptorsTest, InterfaceAssociations) {
- // Links interfaces 0 and 1 into a single function.
- static const uint8_t kIAD1[] = {0x08, 0x0b, 0x00, 0x02,
- 0xff, 0xff, 0xff, 0x00};
- // Only references a single interface, 2.
- static const uint8_t kIAD2[] = {0x08, 0x0b, 0x02, 0x01,
- 0xff, 0xff, 0xff, 0x00};
- // Malformed. References interface 3 but bInterfaceCount is 0.
- static const uint8_t kIAD3[] = {0x08, 0x0b, 0x03, 0x00,
- 0xff, 0xff, 0xff, 0x00};
- // Malformed. References an indefined interface.
- static const uint8_t kIAD4[] = {0x08, 0x0b, 0x07, 0x00,
- 0xff, 0xff, 0xff, 0x00};
- // Links interfaces 4 and 5 into a single function.
- static const uint8_t kIAD5[] = {0x08, 0x0b, 0x04, 0x01,
- 0xff, 0xff, 0xff, 0x00};
-
- UsbConfigDescriptor config(1, false, false, 0);
- config.extra_data.assign(kIAD1, kIAD1 + sizeof(kIAD1));
- config.extra_data.insert(config.extra_data.end(), kIAD2,
- kIAD2 + sizeof(kIAD2));
- config.interfaces.emplace_back(0, 0, 255, 255, 255);
- config.interfaces.emplace_back(1, 0, 255, 255, 255);
- UsbInterfaceDescriptor iface1a(1, 1, 255, 255, 255);
- iface1a.extra_data.assign(kIAD3, kIAD3 + sizeof(kIAD3));
- config.interfaces.push_back(std::move(iface1a));
- config.interfaces.emplace_back(2, 0, 255, 255, 255);
- config.interfaces.emplace_back(3, 0, 255, 255, 255);
- UsbInterfaceDescriptor iface4(4, 0, 255, 255, 255);
- iface4.extra_data.assign(kIAD4, kIAD4 + sizeof(kIAD4));
- iface4.extra_data.insert(iface4.extra_data.end(), kIAD5,
- kIAD5 + sizeof(kIAD5));
- config.interfaces.push_back(std::move(iface4));
- config.interfaces.emplace_back(5, 0, 255, 255, 255);
- config.AssignFirstInterfaceNumbers();
-
- EXPECT_EQ(0, config.interfaces[0].first_interface);
- EXPECT_EQ(0, config.interfaces[1].first_interface);
- EXPECT_EQ(0, config.interfaces[2].first_interface);
- EXPECT_EQ(2, config.interfaces[3].first_interface);
- EXPECT_EQ(3, config.interfaces[4].first_interface);
- EXPECT_EQ(4, config.interfaces[5].first_interface);
- EXPECT_EQ(4, config.interfaces[5].first_interface);
-}
-
-TEST_F(UsbDescriptorsTest, CorruptInterfaceAssociations) {
- {
- // Descriptor is too short.
- static const uint8_t kIAD[] = {0x01};
- UsbConfigDescriptor config(1, false, false, 0);
- config.extra_data.assign(kIAD, kIAD + sizeof(kIAD));
- config.AssignFirstInterfaceNumbers();
- }
- {
- // Descriptor is too long.
- static const uint8_t kIAD[] = {0x09, 0x0b, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00};
- UsbConfigDescriptor config(1, false, false, 0);
- config.extra_data.assign(kIAD, kIAD + sizeof(kIAD));
- config.AssignFirstInterfaceNumbers();
- }
-}
-
TEST_F(UsbDescriptorsTest, StringDescriptor) {
static const uint8_t kBuffer[] = {0x1a, 0x03, 'H', 0, 'e', 0, 'l', 0, 'l', 0,
'o', 0, ' ', 0, 'w', 0, 'o', 0, 'r', 0,
diff --git a/device/usb/usb_device_impl.cc b/device/usb/usb_device_impl.cc
index 118416d..1a8bedf 100644
--- a/device/usb/usb_device_impl.cc
+++ b/device/usb/usb_device_impl.cc
@@ -135,8 +135,6 @@ void ConvertConfigDescriptor(const libusb_config_descriptor* platform_config,
configuration->extra_data.assign(
platform_config->extra,
platform_config->extra + platform_config->extra_length);
-
- configuration->AssignFirstInterfaceNumbers();
}
} // namespace