Index: third_party/hidapi/hidapi_linux.c.patch |
diff --git a/third_party/hidapi/hidapi_linux.c.patch b/third_party/hidapi/hidapi_linux.c.patch |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cfcc22d10d5fb9673fbadd675000409ef646e036 |
--- /dev/null |
+++ b/third_party/hidapi/hidapi_linux.c.patch |
@@ -0,0 +1,118 @@ |
+diff --git a/third_party/hidapi/hidapi_linux.c b/third_party/hidapi/hidapi_linux.c |
+index 39181d9..c0df76f 100644 |
+--- a/third_party/hidapi/hidapi_linux.c |
++++ b/third_party/hidapi/hidapi_linux.c |
+@@ -83,6 +83,8 @@ static __u32 kernel_version = 0; |
+ static hid_device *new_hid_device(void) |
+ { |
+ hid_device *dev = calloc(1, sizeof(hid_device)); |
++ if (dev == NULL) |
++ return NULL; |
+ dev->device_handle = -1; |
+ dev->blocking = 1; |
+ dev->uses_numbered_reports = 0; |
+@@ -102,6 +104,8 @@ static wchar_t *utf8_to_wchar_t(const char *utf8) |
+ return wcsdup(L""); |
+ } |
+ ret = calloc(wlen+1, sizeof(wchar_t)); |
++ if (ret == NULL) |
++ return NULL; |
+ mbstowcs(ret, utf8, wlen+1); |
+ ret[wlen] = 0x0000; |
+ } |
+@@ -124,7 +128,7 @@ static int uses_numbered_reports(__u8 *report_descriptor, __u32 size) { |
+ int data_len, key_size; |
+ |
+ while (i < size) { |
+- int key = report_descriptor[i]; |
++ __u8 key = report_descriptor[i]; |
+ |
+ /* Check for the Report ID key */ |
+ if (key == 0x85/*Report ID*/) { |
+@@ -267,6 +271,9 @@ static int get_device_string(hid_device *dev, enum device_string_id key, wchar_t |
+ int bus_type; |
+ size_t retm; |
+ |
++ serial_number_utf8 = NULL; |
++ product_name_utf8 = NULL; |
++ |
+ ret = parse_uevent_info( |
+ udev_device_get_sysattr_value(hid_dev, "uevent"), |
+ &bus_type, |
+@@ -275,6 +282,8 @@ static int get_device_string(hid_device *dev, enum device_string_id key, wchar_t |
+ &serial_number_utf8, |
+ &product_name_utf8); |
+ |
++ if (!ret) goto end; |
++ |
+ if (bus_type == BUS_BLUETOOTH) { |
+ switch (key) { |
+ case DEVICE_STRING_MANUFACTURER: |
+@@ -282,11 +291,11 @@ static int get_device_string(hid_device *dev, enum device_string_id key, wchar_t |
+ ret = 0; |
+ break; |
+ case DEVICE_STRING_PRODUCT: |
+- retm = mbstowcs(string, product_name_utf8, maxlen); |
++ retm = mbstowcs(string, product_name_utf8, maxlen - 1); |
+ ret = (retm == (size_t)-1)? -1: 0; |
+ break; |
+ case DEVICE_STRING_SERIAL: |
+- retm = mbstowcs(string, serial_number_utf8, maxlen); |
++ retm = mbstowcs(string, serial_number_utf8, maxlen - 1); |
+ ret = (retm == (size_t)-1)? -1: 0; |
+ break; |
+ case DEVICE_STRING_COUNT: |
+@@ -305,7 +314,7 @@ static int get_device_string(hid_device *dev, enum device_string_id key, wchar_t |
+ const char *str; |
+ const char *key_str = NULL; |
+ |
+- if (key >= 0 && key < DEVICE_STRING_COUNT) { |
++ if (key < DEVICE_STRING_COUNT) { |
+ key_str = device_string_names[key]; |
+ } else { |
+ ret = -1; |
+@@ -437,6 +446,10 @@ struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, |
+ |
+ /* VID/PID match. Create the record. */ |
+ tmp = malloc(sizeof(struct hid_device_info)); |
++ if (tmp == NULL) { |
++ goto next; |
++ } |
++ |
+ if (cur_dev) { |
+ cur_dev->next = tmp; |
+ } |
+@@ -629,13 +642,13 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path) |
+ |
+ /* Get Report Descriptor Size */ |
+ res = ioctl(dev->device_handle, HIDIOCGRDESCSIZE, &desc_size); |
+- if (res < 0) |
++ if (res < 0) { |
+ perror("HIDIOCGRDESCSIZE"); |
+- |
+- |
++ } else { |
+ /* Get Report Descriptor */ |
+ rpt_desc.size = desc_size; |
+ res = ioctl(dev->device_handle, HIDIOCGRDESC, &rpt_desc); |
++ |
+ if (res < 0) { |
+ perror("HIDIOCGRDESC"); |
+ } else { |
+@@ -644,6 +657,7 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path) |
+ uses_numbered_reports(rpt_desc.value, |
+ rpt_desc.size); |
+ } |
++ } |
+ |
+ return dev; |
+ } |
+@@ -699,7 +713,7 @@ int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t |
+ if (bytes_read < 0 && (errno == EAGAIN || errno == EINPROGRESS)) |
+ bytes_read = 0; |
+ |
+- if (bytes_read >= 0 && |
++ if (bytes_read > 0 && |
+ kernel_version < KERNEL_VERSION(2,6,34) && |
+ dev->uses_numbered_reports) { |
+ /* Work around a kernel bug. Chop off the first byte. */ |