Author: kaiw
Date: Sun May  9 09:20:25 2010
New Revision: 207812
URL: http://svn.freebsd.org/changeset/base/207812

Log:
  Catch up with libusbhid merge (rev 205728).
  
  hid_get_data() now expects that the hid data passed in always contains
  the report ID byte. Thus we should not skip the the report ID byte in
  hid_interrupt().  Also, if HUP_KEYBOARD usage is an array, do not try
  to modify the 'data' pointer, instead, increase the hid_item_t field
  'pos' by 'report_size' before calling hid_get_data() during each
  iteration.
  
  PR:                   usb/146367
  Reported and tested by:       Alex Deiter
  Pointy hat to:                kaiw
  Reviewed by:          emax

Modified:
  head/usr.sbin/bluetooth/bthidd/hid.c

Modified: head/usr.sbin/bluetooth/bthidd/hid.c
==============================================================================
--- head/usr.sbin/bluetooth/bthidd/hid.c        Sun May  9 08:22:33 2010        
(r207811)
+++ head/usr.sbin/bluetooth/bthidd/hid.c        Sun May  9 09:20:25 2010        
(r207812)
@@ -130,7 +130,7 @@ hid_interrupt(bthid_session_p s, uint8_t
        hid_item_t      h;
        int32_t         report_id, usage, page, val,
                        mouse_x, mouse_y, mouse_z, mouse_butt,
-                       mevents, kevents;
+                       mevents, kevents, i;
 
        assert(s != NULL);
        assert(s->srv != NULL);
@@ -150,8 +150,8 @@ hid_interrupt(bthid_session_p s, uint8_t
        }
 
        report_id = data[1];
-       data += 2;
-       len -= 2;
+       data ++;
+       len --;
 
        hid_device = get_hid_device(&s->bdaddr);
        assert(hid_device != NULL);
@@ -202,17 +202,11 @@ hid_interrupt(bthid_session_p s, uint8_t
                                if (val && val < kbd_maxkey())
                                        bit_set(s->keys1, val);
 
-                               data ++;
-                               len --;
-
-                               len = min(len, h.report_size);
-                               while (len > 0) {
+                               for (i = 1; i < h.report_count; i++) {
+                                       h.pos += h.report_size;
                                        val = hid_get_data(data, &h);
                                        if (val && val < kbd_maxkey())
                                                bit_set(s->keys1, val);
-
-                                       data ++;
-                                       len --;
                                }
                        }
                        break;
_______________________________________________
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