svn commit: r229388 - stable/8/lib/libusbhid
Alexander Motin
mav at FreeBSD.org
Tue Jan 3 13:13:32 UTC 2012
Author: mav
Date: Tue Jan 3 13:13:31 2012
New Revision: 229388
URL: http://svn.freebsd.org/changeset/base/229388
Log:
MFC r213920 (by hselasky):
- 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.
Modified:
stable/8/lib/libusbhid/Makefile
stable/8/lib/libusbhid/descr.c
stable/8/lib/libusbhid/usbvar.h
Directory Properties:
stable/8/lib/libusbhid/ (props changed)
Modified: stable/8/lib/libusbhid/Makefile
==============================================================================
--- stable/8/lib/libusbhid/Makefile Tue Jan 3 12:47:55 2012 (r229387)
+++ stable/8/lib/libusbhid/Makefile Tue Jan 3 13:13:31 2012 (r229388)
@@ -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: stable/8/lib/libusbhid/descr.c
==============================================================================
--- stable/8/lib/libusbhid/descr.c Tue Jan 3 12:47:55 2012 (r229387)
+++ stable/8/lib/libusbhid/descr.c Tue Jan 3 13:13:31 2012 (r229388)
@@ -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: stable/8/lib/libusbhid/usbvar.h
==============================================================================
--- stable/8/lib/libusbhid/usbvar.h Tue Jan 3 12:47:55 2012 (r229387)
+++ stable/8/lib/libusbhid/usbvar.h Tue Jan 3 13:13:31 2012 (r229388)
@@ -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-stable-8
mailing list