Skip to content

Commit fdc7f5f

Browse files
authored
Merge pull request #4819 from dhalbert/fix-out_report_length
fix check of usb_hid.Device out_report_length
2 parents 6e71f60 + e7f82f8 commit fdc7f5f

File tree

2 files changed

+14
-9
lines changed

2 files changed

+14
-9
lines changed

locale/circuitpython.pot

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ msgstr ""
8787
msgid "%q list must be a list"
8888
msgstr ""
8989

90+
#: shared-bindings/usb_hid/Device.c
91+
msgid "%q must be 0-255"
92+
msgstr ""
93+
9094
#: shared-bindings/usb_hid/Device.c
9195
msgid "%q must be 1-255"
9296
msgstr ""
@@ -104,7 +108,7 @@ msgid "%q must be >= 1"
104108
msgstr ""
105109

106110
#: shared-bindings/usb_hid/Device.c
107-
msgid "%q must be None or 1-255"
111+
msgid "%q must be None or between 1 and len(report_descriptor)-1"
108112
msgstr ""
109113

110114
#: shared-module/vectorio/Polygon.c

shared-bindings/usb_hid/Device.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,16 @@ STATIC mp_obj_t usb_hid_device_make_new(const mp_obj_type_t *type, size_t n_args
6969
{ MP_QSTR_usage_page, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT },
7070
{ MP_QSTR_usage, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT },
7171
{ MP_QSTR_in_report_length, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT },
72-
{ MP_QSTR_out_report_length, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_int = 0 } },
72+
{ MP_QSTR_out_report_length, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0 } },
7373
{ MP_QSTR_report_id_index, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = mp_const_none } },
7474
};
7575

7676
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
7777
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
7878

79-
mp_buffer_info_t bufinfo;
80-
mp_get_buffer_raise(args[ARG_report_descriptor].u_obj, &bufinfo, MP_BUFFER_READ);
81-
mp_obj_t descriptor = mp_obj_new_bytearray(bufinfo.len, bufinfo.buf);
79+
mp_buffer_info_t descriptor_bufinfo;
80+
mp_get_buffer_raise(args[ARG_report_descriptor].u_obj, &descriptor_bufinfo, MP_BUFFER_READ);
81+
mp_obj_t descriptor = mp_obj_new_bytearray(descriptor_bufinfo.len, descriptor_bufinfo.buf);
8282

8383
const mp_int_t usage_page_arg = args[ARG_usage_page].u_int;
8484
if (usage_page_arg <= 0 || usage_page_arg > 255) {
@@ -99,17 +99,18 @@ STATIC mp_obj_t usb_hid_device_make_new(const mp_obj_type_t *type, size_t n_args
9999
const uint8_t in_report_length = in_report_length_arg;
100100

101101
const mp_int_t out_report_length_arg = args[ARG_out_report_length].u_int;
102-
if (out_report_length_arg <= 0 || out_report_length_arg > 255) {
103-
mp_raise_ValueError_varg(translate("%q must be 1-255"), MP_QSTR_out_report_length);
102+
if (out_report_length_arg < 0 || out_report_length_arg > 255) {
103+
mp_raise_ValueError_varg(translate("%q must be 0-255"), MP_QSTR_out_report_length);
104104
}
105105
const uint8_t out_report_length = out_report_length_arg;
106106

107107
const mp_obj_t report_id_index_arg = args[ARG_report_id_index].u_obj;
108108
uint8_t report_id_index = 0;
109109
if (report_id_index_arg != mp_const_none) {
110110
const mp_int_t report_id_index_int = mp_obj_int_get_checked(report_id_index_arg);
111-
if (report_id_index_int <= 0 || report_id_index_int > 255) {
112-
mp_raise_ValueError_varg(translate("%q must be None or 1-255"), MP_QSTR_report_id_index);
111+
if (report_id_index_int <= 0 || (uint32_t)report_id_index_int >= descriptor_bufinfo.len) {
112+
mp_raise_ValueError_varg(translate("%q must be None or between 1 and len(report_descriptor)-1"),
113+
MP_QSTR_report_id_index);
113114
}
114115
report_id_index = report_id_index_int;
115116
}

0 commit comments

Comments
 (0)