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_ */
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to