[PATCH] hid_parse failure

Subsystems: hid core layer, the rest

STALE5209d

3 messages, 2 authors, 2012-05-10 · open the first message on its own page

[PATCH] hid_parse failure

From: srinivas pandruvada <hidden>
Date: 2012-05-01 16:19:47

When logical maximum is 0xffffffff, the parser fails even if
logical minimum is equal to or greater than  0.
By HID specification, if both the Logical Minimum and Logical
Maximum extents are defined as positive values (0 or greater)
then the report field can be assumed to be an unsigned value.
Otherwise, all integer values are signed values represented
in 2’s complement format.
---
 drivers/hid/hid-core.c |   12 ++++++++++--
 1 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index c757f10..b616f4b 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -225,8 +225,16 @@ static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsign
 		return -1;
 	}
 
-	if (parser->global.logical_maximum < parser->global.logical_minimum) {
-		dbg_hid("logical range invalid %d %d\n", parser->global.logical_minimum, parser->global.logical_maximum);
+	if ((parser->global.logical_minimum < 0 &&
+		parser->global.logical_maximum <
+			parser->global.logical_minimum) ||
+		(parser->global.logical_minimum >= 0 &&
+			(__u32)parser->global.logical_maximum <
+			(__u32)parser->global.logical_minimum)
+		) {
+		dbg_hid("logical range invalid 0x%x 0x%x\n",
+			parser->global.logical_minimum,
+				parser->global.logical_maximum);
 		return -1;
 	}
 
-- 
1.7.7.6

--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Re: [PATCH] hid_parse failure

From: Jiri Kosina <hidden>
Date: 2012-05-10 10:21:36

On Tue, 1 May 2012, srinivas pandruvada wrote:
When logical maximum is 0xffffffff, the parser fails even if
logical minimum is equal to or greater than  0.
By HID specification, if both the Logical Minimum and Logical
Maximum extents are defined as positive values (0 or greater)
then the report field can be assumed to be an unsigned value.
Otherwise, all integer values are signed values represented
in 2’s complement format.
Signed-off-by: line is missing, could you please fix that?
quoted hunk
---
 drivers/hid/hid-core.c |   12 ++++++++++--
 1 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index c757f10..b616f4b 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -225,8 +225,16 @@ static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsign
 		return -1;
 	}
 
-	if (parser->global.logical_maximum < parser->global.logical_minimum) {
-		dbg_hid("logical range invalid %d %d\n", parser->global.logical_minimum, parser->global.logical_maximum);
+	if ((parser->global.logical_minimum < 0 &&
+		parser->global.logical_maximum <
+			parser->global.logical_minimum) ||
+		(parser->global.logical_minimum >= 0 &&
+			(__u32)parser->global.logical_maximum <
+			(__u32)parser->global.logical_minimum)
+		) {
+		dbg_hid("logical range invalid 0x%x 0x%x\n",
+			parser->global.logical_minimum,
+				parser->global.logical_maximum);
 		return -1;
 	}
The change looks correct per se, but I will have to think a little bit 
more whether other places of report parsing don't need similar adjustments 
as well to work properly in such scenarios.

How did you find this out? By code/spec inspection, or do you actually 
have the device that exposes this problem?

Thanks,

-- 
Jiri Kosina
SUSE Labs
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

RE: [PATCH] hid_parse failure

From: Pandruvada, Srinivas <hidden>
Date: 2012-05-10 14:04:58

I have a sensor hub device, which exposes this problem.  I will send patch again.
I will send the patch again.

Thanks,
Srinivas


-----Original Message-----
From: Jiri Kosina [mailto:jkosina@suse.cz] 
Sent: Thursday, May 10, 2012 3:21 AM
To: Pandruvada, Srinivas
Cc: linux-input@vger.kernel.org
Subject: Re: [PATCH] hid_parse failure

On Tue, 1 May 2012, srinivas pandruvada wrote:
When logical maximum is 0xffffffff, the parser fails even if logical 
minimum is equal to or greater than  0.
By HID specification, if both the Logical Minimum and Logical Maximum 
extents are defined as positive values (0 or greater) then the report 
field can be assumed to be an unsigned value.
Otherwise, all integer values are signed values represented in 2’s 
complement format.
Signed-off-by: line is missing, could you please fix that?
quoted hunk
---
 drivers/hid/hid-core.c |   12 ++++++++++--
 1 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 
c757f10..b616f4b 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -225,8 +225,16 @@ static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsign
 		return -1;
 	}
 
-	if (parser->global.logical_maximum < parser->global.logical_minimum) {
-		dbg_hid("logical range invalid %d %d\n", parser->global.logical_minimum, parser->global.logical_maximum);
+	if ((parser->global.logical_minimum < 0 &&
+		parser->global.logical_maximum <
+			parser->global.logical_minimum) ||
+		(parser->global.logical_minimum >= 0 &&
+			(__u32)parser->global.logical_maximum <
+			(__u32)parser->global.logical_minimum)
+		) {
+		dbg_hid("logical range invalid 0x%x 0x%x\n",
+			parser->global.logical_minimum,
+				parser->global.logical_maximum);
 		return -1;
 	}
The change looks correct per se, but I will have to think a little bit more whether other places of report parsing don't need similar adjustments as well to work properly in such scenarios.

How did you find this out? By code/spec inspection, or do you actually have the device that exposes this problem?

Thanks,

--
Jiri Kosina
SUSE Labs
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help