- Add support for libusbhid in 32-bit compatibility mode.

- Add missing check for ugd_actlen being too small.
- Add missing inclusion guard to usbvar.h header file.
- This also fixes buildworld breakage since r213852.
This commit is contained in:
hselasky 2010-10-16 11:20:53 +00:00
parent 21647a4834
commit 5b550686a5
3 changed files with 25 additions and 3 deletions

View File

@ -19,4 +19,8 @@ SRCS= descr.c descr_compat.c parse.c usage.c data.c
INCS= usbhid.h
.if defined(COMPAT_32BIT)
CFLAGS+= -DCOMPAT_32BIT
.endif
.include <bsd.lib.mk>

View File

@ -103,7 +103,7 @@ hid_get_report_desc(int fd)
memset(&ugd, 0, sizeof(ugd));
/* get actual length first */
ugd.ugd_data = NULL;
ugd.ugd_data = hid_pass_ptr(NULL);
ugd.ugd_maxlen = 65535;
if (ioctl(fd, USB_GET_REPORT_DESC, &ugd) < 0) {
#ifdef HID_COMPAT7
@ -124,7 +124,7 @@ hid_get_report_desc(int fd)
return (NULL);
/* fetch actual descriptor */
ugd.ugd_data = data;
ugd.ugd_data = hid_pass_ptr(data);
ugd.ugd_maxlen = ugd.ugd_actlen;
if (ioctl(fd, USB_GET_REPORT_DESC, &ugd) < 0) {
/* could not read descriptor */
@ -132,8 +132,15 @@ hid_get_report_desc(int fd)
return (NULL);
}
/* sanity check */
if (ugd.ugd_actlen < 1) {
/* invalid report descriptor */
free(data);
return (NULL);
}
/* check END_COLLECTION */
if (((unsigned char *)ugd.ugd_data)[ugd.ugd_actlen -1] != 0xC0) {
if (((unsigned char *)data)[ugd.ugd_actlen -1] != 0xC0) {
/* invalid end byte */
free(data);
return (NULL);

View File

@ -29,6 +29,9 @@
*
*/
#ifndef _USBVAR_H_
#define _USBVAR_H_
struct report_desc {
uint32_t size;
uint8_t data[1];
@ -41,3 +44,11 @@ int hid_set_immed_compat7(int fd, int enable);
int hid_get_report_id_compat7(int fd);
report_desc_t hid_get_report_desc_compat7(int fd);
#endif
#ifdef COMPAT_32BIT
#define hid_pass_ptr(ptr) ((uint64_t)(uintptr_t)(ptr))
#else
#define hid_pass_ptr(ptr) (ptr)
#endif
#endif /* _USBVAR_H_ */