Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Jan 2012 13:13:32 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r229388 - stable/8/lib/libusbhid
Message-ID:  <201201031313.q03DDW7o025300@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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_ */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201201031313.q03DDW7o025300>