diff options
author | hselasky <hselasky@FreeBSD.org> | 2010-10-16 11:20:53 +0000 |
---|---|---|
committer | hselasky <hselasky@FreeBSD.org> | 2010-10-16 11:20:53 +0000 |
commit | 5b550686a5110cf18c816f96d37d170d8a28e4dc (patch) | |
tree | 1ea0271ac1ee85fd4578cf84cc88d1e6186f7224 /lib | |
parent | 21647a48345019a086209231c331adba0d1be8be (diff) | |
download | FreeBSD-src-5b550686a5110cf18c816f96d37d170d8a28e4dc.zip FreeBSD-src-5b550686a5110cf18c816f96d37d170d8a28e4dc.tar.gz |
- 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.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libusbhid/Makefile | 4 | ||||
-rw-r--r-- | lib/libusbhid/descr.c | 13 | ||||
-rw-r--r-- | lib/libusbhid/usbvar.h | 11 |
3 files changed, 25 insertions, 3 deletions
diff --git a/lib/libusbhid/Makefile b/lib/libusbhid/Makefile index 2a58a4b..7dba7ff 100644 --- a/lib/libusbhid/Makefile +++ b/lib/libusbhid/Makefile @@ -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> diff --git a/lib/libusbhid/descr.c b/lib/libusbhid/descr.c index a5c033a..def90da 100644 --- a/lib/libusbhid/descr.c +++ b/lib/libusbhid/descr.c @@ -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); diff --git a/lib/libusbhid/usbvar.h b/lib/libusbhid/usbvar.h index 9605106..2722a37 100644 --- a/lib/libusbhid/usbvar.h +++ b/lib/libusbhid/usbvar.h @@ -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_ */ |