Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 9 May 2010 09:20:25 +0000 (UTC)
From:      Kai Wang <kaiw@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r207812 - head/usr.sbin/bluetooth/bthidd
Message-ID:  <201005090920.o499KPGD089986@svn.freebsd.org>

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



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