btstack_hid_parser: return if btstack_hid_parse_descriptor_item was sucessful

This commit is contained in:
Matthias Ringwald 2024-03-07 12:35:05 +01:00
parent d7bfc7cd40
commit 76fa2448e1
2 changed files with 8 additions and 6 deletions

View File

@ -147,12 +147,12 @@ static void hid_pretty_print_item(btstack_hid_parser_t * parser, hid_descriptor_
} }
// parse descriptor item and read up to 32-bit bit value // parse descriptor item and read up to 32-bit bit value
void btstack_hid_parse_descriptor_item(hid_descriptor_item_t * item, const uint8_t * hid_descriptor, uint16_t hid_descriptor_len){ bool btstack_hid_parse_descriptor_item(hid_descriptor_item_t * item, const uint8_t * hid_descriptor, uint16_t hid_descriptor_len){
const int hid_item_sizes[] = { 0, 1, 2, 4 }; const int hid_item_sizes[] = { 0, 1, 2, 4 };
// parse item header // parse item header
if (hid_descriptor_len < 1u) return; if (hid_descriptor_len < 1u) return false;
uint16_t pos = 0; uint16_t pos = 0;
uint8_t item_header = hid_descriptor[pos++]; uint8_t item_header = hid_descriptor[pos++];
item->data_size = hid_item_sizes[item_header & 0x03u]; item->data_size = hid_item_sizes[item_header & 0x03u];
@ -160,7 +160,7 @@ void btstack_hid_parse_descriptor_item(hid_descriptor_item_t * item, const uint8
item->item_tag = (item_header & 0xf0u) >> 4u; item->item_tag = (item_header & 0xf0u) >> 4u;
// long item // long item
if ((item->data_size == 2u) && (item->item_tag == 0x0fu) && (item->item_type == 3u)){ if ((item->data_size == 2u) && (item->item_tag == 0x0fu) && (item->item_type == 3u)){
if (hid_descriptor_len < 3u) return; if (hid_descriptor_len < 3u) return false;
item->data_size = hid_descriptor[pos++]; item->data_size = hid_descriptor[pos++];
item->item_tag = hid_descriptor[pos++]; item->item_tag = hid_descriptor[pos++];
} }
@ -168,8 +168,8 @@ void btstack_hid_parse_descriptor_item(hid_descriptor_item_t * item, const uint8
item->item_value = 0; item->item_value = 0;
// read item value // read item value
if (hid_descriptor_len < item->item_size) return; if (hid_descriptor_len < item->item_size) return false;
if (item->data_size > 4u) return; if (item->data_size > 4u) return false;
int i; int i;
int sgnd = (item->item_type == Global) && (item->item_tag > 0u) && (item->item_tag < 5u); int sgnd = (item->item_type == Global) && (item->item_tag > 0u) && (item->item_tag < 5u);
int32_t value = 0; int32_t value = 0;
@ -184,6 +184,7 @@ void btstack_hid_parse_descriptor_item(hid_descriptor_item_t * item, const uint8
} }
} }
item->item_value = value; item->item_value = value;
return true;
} }
static void btstack_hid_handle_global_item(btstack_hid_parser_t * parser, hid_descriptor_item_t * item){ static void btstack_hid_handle_global_item(btstack_hid_parser_t * parser, hid_descriptor_item_t * item){

View File

@ -184,8 +184,9 @@ void btstack_hid_parser_get_field(btstack_hid_parser_t * parser, uint16_t * usag
* @param item * @param item
* @param hid_descriptor * @param hid_descriptor
* @param hid_descriptor_len * @param hid_descriptor_len
* @return true if item has been parsed successfully
*/ */
void btstack_hid_parse_descriptor_item(hid_descriptor_item_t * item, const uint8_t * hid_descriptor, uint16_t hid_descriptor_len); bool btstack_hid_parse_descriptor_item(hid_descriptor_item_t * item, const uint8_t * hid_descriptor, uint16_t hid_descriptor_len);
/** /**
* @brief Parses descriptor and returns report size for given report ID and report type * @brief Parses descriptor and returns report size for given report ID and report type