svn commit: r213920 - head/lib/libusbhid
Hans Petter Selasky
hselasky at FreeBSD.org
Sat Oct 16 11:20:54 UTC 2010
Author: hselasky
Date: Sat Oct 16 11:20:53 2010
New Revision: 213920
URL: http://svn.freebsd.org/changeset/base/213920
Log:
- 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.
Modified:
head/lib/libusbhid/Makefile
head/lib/libusbhid/descr.c
head/lib/libusbhid/usbvar.h
Modified: head/lib/libusbhid/Makefile
==============================================================================
--- head/lib/libusbhid/Makefile Sat Oct 16 11:19:31 2010 (r213919)
+++ head/lib/libusbhid/Makefile Sat Oct 16 11:20:53 2010 (r213920)
@@ -19,4 +19,8 @@ SRCS= descr.c descr_compat.c parse.c usa
INCS= usbhid.h
+.if defined(COMPAT_32BIT)
+CFLAGS+= -DCOMPAT_32BIT
+.endif
+
.include <bsd.lib.mk>
Modified: head/lib/libusbhid/descr.c
==============================================================================
--- head/lib/libusbhid/descr.c Sat Oct 16 11:19:31 2010 (r213919)
+++ head/lib/libusbhid/descr.c Sat Oct 16 11:20:53 2010 (r213920)
@@ -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);
Modified: head/lib/libusbhid/usbvar.h
==============================================================================
--- head/lib/libusbhid/usbvar.h Sat Oct 16 11:19:31 2010 (r213919)
+++ head/lib/libusbhid/usbvar.h Sat Oct 16 11:20:53 2010 (r213920)
@@ -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 en
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_ */
More information about the svn-src-head
mailing list