Module Name:    src
Committed By:   jakllsch
Date:           Fri Aug 13 19:56:35 UTC 2010

Modified Files:
        src/lib/libusbhid: parse.c

Log Message:
Improve usbhid(3) descriptor/report parsing:
 Handle signed Physical Minimums
 Handle signed Unit Exponents


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/lib/libusbhid/parse.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libusbhid/parse.c
diff -u src/lib/libusbhid/parse.c:1.6 src/lib/libusbhid/parse.c:1.7
--- src/lib/libusbhid/parse.c:1.6	Tue Jan  5 17:57:06 2010
+++ src/lib/libusbhid/parse.c	Fri Aug 13 19:56:34 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: parse.c,v 1.6 2010/01/05 17:57:06 jakllsch Exp $	*/
+/*	$NetBSD: parse.c,v 1.7 2010/08/13 19:56:34 jakllsch Exp $	*/
 
 /*
  * Copyright (c) 1999, 2001 Lennart Augustsson <augus...@netbsd.org>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: parse.c,v 1.6 2010/01/05 17:57:06 jakllsch Exp $");
+__RCSID("$NetBSD: parse.c,v 1.7 2010/08/13 19:56:34 jakllsch Exp $");
 
 #include <assert.h>
 #include <stdlib.h>
@@ -50,6 +50,7 @@
 	int nusage;
 	int minset;
 	int logminsize;
+	int phyminsize;
 	int multi;
 	int multimax;
 	int kindset;
@@ -174,6 +175,14 @@
 			else if (s->logminsize == 2)
 				c->logical_minimum =(int16_t)c->logical_minimum;
 		}
+		if (c->physical_minimum >= c->physical_maximum) {
+			if (s->phyminsize == 1)
+				c->physical_minimum =
+					(int8_t)c->physical_minimum;
+			else if (s->phyminsize == 2)
+				c->physical_minimum =
+					(int16_t)c->physical_minimum;
+		}
 		if (s->multi < s->multimax) {
 			c->usage = s->usages[min(s->multi, s->nusage-1)];
 			s->multi++;
@@ -334,12 +343,16 @@
 				break;
 			case 3:
 				c->physical_minimum = dval;
+				s->phyminsize = bSize;
 				break;
 			case 4:
 				c->physical_maximum = dval;
 				break;
 			case 5:
-				c->unit_exponent = dval;
+				if ( dval > 7 && dval < 0x10)
+					c->unit_exponent = -16 + dval;
+				else
+					c->unit_exponent = dval;
 				break;
 			case 6:
 				c->unit = dval;

Reply via email to