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 <[email protected]>
@@ -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;