From c49f51c451516bf06afc6d71947eb11cc4627273 Mon Sep 17 00:00:00 2001 From: Christopher Ferris Date: Fri, 23 Jan 2015 17:09:56 -0800 Subject: [PATCH] Fix the v2 descriptor handling. There was a misinterpretation of how the v2 header works. The flags in the header indicate what is in the rest of the structure. Bug: 19127803 Change-Id: I5fa0dae6da51522c9afc4c94838eb6f462208683 --- adb/usb_linux_client.c | 17 ++++++----------- fastbootd/usb_linux_client.c | 17 ++++++----------- 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/adb/usb_linux_client.c b/adb/usb_linux_client.c index fd566f48e..ee6b37c71 100644 --- a/adb/usb_linux_client.c +++ b/adb/usb_linux_client.c @@ -73,14 +73,10 @@ struct desc_v1 { } __attribute__((packed)); struct desc_v2 { - struct usb_functionfs_descs_head_v2 { - __le32 magic; - __le32 length; - __le32 flags; - __le32 fs_count; - __le32 hs_count; - __le32 ss_count; - } __attribute__((packed)) header; + struct usb_functionfs_descs_head_v2 header; + // The rest of the structure depends on the flags in the header. + __le32 fs_count; + __le32 hs_count; struct func_desc fs_descs, hs_descs; } __attribute__((packed)); @@ -284,9 +280,8 @@ static void init_functionfs(struct usb_handle *h) v2_descriptor.header.magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2); v2_descriptor.header.length = cpu_to_le32(sizeof(v2_descriptor)); v2_descriptor.header.flags = FUNCTIONFS_HAS_FS_DESC | FUNCTIONFS_HAS_HS_DESC; - v2_descriptor.header.fs_count = 3; - v2_descriptor.header.hs_count = 3; - v2_descriptor.header.ss_count = 0; + v2_descriptor.fs_count = 3; + v2_descriptor.hs_count = 3; v2_descriptor.fs_descs = fs_descriptors; v2_descriptor.hs_descs = hs_descriptors; diff --git a/fastbootd/usb_linux_client.c b/fastbootd/usb_linux_client.c index beaafc37c..0ef15a6bb 100644 --- a/fastbootd/usb_linux_client.c +++ b/fastbootd/usb_linux_client.c @@ -87,14 +87,10 @@ struct desc_v1 { } __attribute__((packed)); struct desc_v2 { - struct usb_functionfs_descs_head_v2 { - __le32 magic; - __le32 length; - __le32 flags; - __le32 fs_count; - __le32 hs_count; - __le32 ss_count; - } __attribute__((packed)) header; + struct usb_functionfs_descs_head_v2 header; + // The rest of the structure depends on the flags in the header. + __le32 fs_count; + __le32 hs_count; struct func_desc fs_descs, hs_descs; } __attribute__((packed)); @@ -182,9 +178,8 @@ static int init_functionfs(struct usb_transport *usb_transport) v2_descriptor.header.magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2); v2_descriptor.header.length = cpu_to_le32(sizeof(v2_descriptor)); v2_descriptor.header.flags = FUNCTIONFS_HAS_FS_DESC | FUNCTIONFS_HAS_HS_DESC; - v2_descriptor.header.fs_count = 3; - v2_descriptor.header.hs_count = 3; - v2_descriptor.header.ss_count = 0; + v2_descriptor.fs_count = 3; + v2_descriptor.hs_count = 3; v2_descriptor.fs_descs = fs_descriptors; v2_descriptor.hs_descs = hs_descriptors;