mirror of
https://github.com/hathach/tinyusb.git
synced 2026-08-18 11:02:16 +00:00
improve pointer arithmetic, check funmctional descriptor bLength
Signed-off-by: HiFiPhile <admin@hifiphile.com>
This commit is contained in:
@ -1024,6 +1024,8 @@ static uint16_t acm_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, u
|
||||
const uint8_t *p_desc = (const uint8_t *)itf_desc;
|
||||
const uint8_t *desc_end = p_desc + max_len;
|
||||
|
||||
TU_ASSERT(TU_DESC_VALIDATE(tu_desc_len(p_desc) <= max_len), 0);
|
||||
|
||||
cdch_interface_t *p_cdc = make_new_itf(daddr, itf_desc);
|
||||
TU_VERIFY(p_cdc, 0);
|
||||
p_cdc->serial_drid = SERIAL_DRIVER_ACM;
|
||||
@ -1033,11 +1035,12 @@ static uint16_t acm_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, u
|
||||
|
||||
// Communication Functional Descriptors
|
||||
// need the 3-byte header (bLength/bDescriptorType/bDescriptorSubType) in bounds before reading it, and a
|
||||
// bLength >= 3 both keeps those reads valid and stops a zero-length descriptor from spinning the walk
|
||||
while ((p_desc < desc_end) && TU_DESC_VALIDATE(p_desc + 3 <= desc_end) &&
|
||||
TUSB_DESC_CS_INTERFACE == tu_desc_type(p_desc) && TU_DESC_VALIDATE(tu_desc_len(p_desc) >= 3)) {
|
||||
// fully contained bLength >= 3 both keeps those reads valid and stops a zero-length descriptor from spinning
|
||||
while ((p_desc < desc_end) && TU_DESC_VALIDATE((size_t)(desc_end - p_desc) >= 3) &&
|
||||
TUSB_DESC_CS_INTERFACE == tu_desc_type(p_desc) && TU_DESC_VALIDATE(tu_desc_len(p_desc) >= 3) &&
|
||||
TU_DESC_VALIDATE(tu_desc_len(p_desc) <= (size_t)(desc_end - p_desc))) {
|
||||
if (CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT == cdc_functional_desc_typeof(p_desc) &&
|
||||
TU_DESC_VALIDATE(p_desc + sizeof(cdc_desc_func_acm_t) <= desc_end)) {
|
||||
TU_DESC_VALIDATE(tu_desc_len(p_desc) >= sizeof(cdc_desc_func_acm_t))) {
|
||||
// save ACM bmCapabilities
|
||||
p_cdc->acm.capability = ((cdc_desc_func_acm_t const *) p_desc)->bmCapabilities;
|
||||
}
|
||||
@ -1048,7 +1051,7 @@ static uint16_t acm_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, u
|
||||
// Open notification endpoint of control interface if any
|
||||
if (itf_desc->bNumEndpoints == 1) {
|
||||
// whole endpoint descriptor must fit: tuh_edpt_open reads the full struct regardless of bLength
|
||||
TU_ASSERT(TU_DESC_VALIDATE(p_desc + sizeof(tusb_desc_endpoint_t) <= desc_end), 0);
|
||||
TU_ASSERT(TU_DESC_VALIDATE((size_t)(desc_end - p_desc) >= sizeof(tusb_desc_endpoint_t)), 0);
|
||||
TU_ASSERT(TUSB_DESC_ENDPOINT == tu_desc_type(p_desc), 0);
|
||||
const tusb_desc_endpoint_t *desc_ep = (const tusb_desc_endpoint_t *)p_desc;
|
||||
TU_ASSERT(tuh_edpt_open(daddr, desc_ep), 0);
|
||||
@ -1059,7 +1062,7 @@ static uint16_t acm_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, u
|
||||
}
|
||||
|
||||
//------------- Data Interface (if any) -------------//
|
||||
if (TU_DESC_VALIDATE(p_desc + sizeof(tusb_desc_interface_t) <= desc_end) &&
|
||||
if (TU_DESC_VALIDATE((size_t)(desc_end - p_desc) >= sizeof(tusb_desc_interface_t)) &&
|
||||
TUSB_DESC_INTERFACE == tu_desc_type(p_desc)) {
|
||||
const tusb_desc_interface_t *data_itf = (const tusb_desc_interface_t *)p_desc;
|
||||
if (data_itf->bInterfaceClass == TUSB_CLASS_CDC_DATA) {
|
||||
@ -1067,7 +1070,7 @@ static uint16_t acm_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, u
|
||||
|
||||
// open_ep_stream_pair consumes exactly two endpoints; require that count and that both fit before reading them
|
||||
TU_ASSERT(TU_DESC_VALIDATE(data_itf->bNumEndpoints == 2), 0);
|
||||
TU_ASSERT(TU_DESC_VALIDATE(p_desc + 2 * sizeof(tusb_desc_endpoint_t) <= desc_end), 0);
|
||||
TU_ASSERT(TU_DESC_VALIDATE((size_t)(desc_end - p_desc) >= 2 * sizeof(tusb_desc_endpoint_t)), 0);
|
||||
TU_ASSERT(open_ep_stream_pair(p_cdc, (const tusb_desc_endpoint_t *)p_desc), 0);
|
||||
p_desc += 2 * sizeof(tusb_desc_endpoint_t);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user