Commit d40d8d96 authored by Rémi Bernon's avatar Rémi Bernon Committed by Alexandre Julliard

hidclass.sys: Drop input packets with unexpected length in non-polled mode.

parent 880d7a11
...@@ -2187,7 +2187,6 @@ static void test_hidp( HANDLE file, HANDLE async_file, int report_id, BOOL polle ...@@ -2187,7 +2187,6 @@ static void test_hidp( HANDLE file, HANDLE async_file, int report_id, BOOL polle
/* first read should be completed */ /* first read should be completed */
ret = GetOverlappedResult( async_file, &overlapped, &value, TRUE ); ret = GetOverlappedResult( async_file, &overlapped, &value, TRUE );
ok( ret, "GetOverlappedResult failed, last error %u\n", GetLastError() ); ok( ret, "GetOverlappedResult failed, last error %u\n", GetLastError() );
todo_wine
ok( value == caps.InputReportByteLength, "got length %u, expected %u\n", value, caps.InputReportByteLength ); ok( value == caps.InputReportByteLength, "got length %u, expected %u\n", value, caps.InputReportByteLength );
/* second read should still be pending */ /* second read should still be pending */
Sleep( 50 ); Sleep( 50 );
...@@ -2206,13 +2205,11 @@ static void test_hidp( HANDLE file, HANDLE async_file, int report_id, BOOL polle ...@@ -2206,13 +2205,11 @@ static void test_hidp( HANDLE file, HANDLE async_file, int report_id, BOOL polle
ret = GetOverlappedResult( async_file, &overlapped2, &value, TRUE ); ret = GetOverlappedResult( async_file, &overlapped2, &value, TRUE );
ok( ret, "GetOverlappedResult failed, last error %u\n", GetLastError() ); ok( ret, "GetOverlappedResult failed, last error %u\n", GetLastError() );
todo_wine
ok( value == caps.InputReportByteLength, "got length %u, expected %u\n", value, caps.InputReportByteLength ); ok( value == caps.InputReportByteLength, "got length %u, expected %u\n", value, caps.InputReportByteLength );
off = report_id ? 0 : 1; off = report_id ? 0 : 1;
todo_wine todo_wine
ok( memcmp( report, buffer, caps.InputReportByteLength ), "expected different report\n" ); ok( memcmp( report, buffer, caps.InputReportByteLength ), "expected different report\n" );
todo_wine
ok( !memcmp( report + off, report + caps.InputReportByteLength, caps.InputReportByteLength - off ), ok( !memcmp( report + off, report + caps.InputReportByteLength, caps.InputReportByteLength - off ),
"expected identical reports\n" ); "expected identical reports\n" );
todo_wine todo_wine
......
...@@ -246,7 +246,8 @@ static DWORD CALLBACK hid_device_thread(void *args) ...@@ -246,7 +246,8 @@ static DWORD CALLBACK hid_device_thread(void *args)
HIDP_COLLECTION_DESC *desc = ext->u.pdo.device_desc.CollectionDesc; HIDP_COLLECTION_DESC *desc = ext->u.pdo.device_desc.CollectionDesc;
HIDP_REPORT_IDS *reports = ext->u.pdo.device_desc.ReportIDs; HIDP_REPORT_IDS *reports = ext->u.pdo.device_desc.ReportIDs;
ULONG report_count = ext->u.pdo.device_desc.ReportIDsLength; ULONG report_count = ext->u.pdo.device_desc.ReportIDsLength;
ULONG i, report_id = 0, poll_interval = 0; BOOL polled = ext->u.pdo.information.Polled;
ULONG i, report_id = 0, timeout = 0;
HID_XFER_PACKET *packet; HID_XFER_PACKET *packet;
IO_STATUS_BLOCK io; IO_STATUS_BLOCK io;
BYTE *buffer; BYTE *buffer;
...@@ -256,7 +257,7 @@ static DWORD CALLBACK hid_device_thread(void *args) ...@@ -256,7 +257,7 @@ static DWORD CALLBACK hid_device_thread(void *args)
buffer = (BYTE *)(packet + 1); buffer = (BYTE *)(packet + 1);
packet->reportBuffer = buffer; packet->reportBuffer = buffer;
if (ext->u.pdo.information.Polled) poll_interval = ext->u.pdo.poll_interval; if (polled) timeout = ext->u.pdo.poll_interval;
for (i = 0; i < report_count; ++i) for (i = 0; i < report_count; ++i)
{ {
...@@ -288,10 +289,11 @@ static DWORD CALLBACK hid_device_thread(void *args) ...@@ -288,10 +289,11 @@ static DWORD CALLBACK hid_device_thread(void *args)
packet->reportBuffer = buffer; packet->reportBuffer = buffer;
packet->reportBufferLen = io.Information; packet->reportBufferLen = io.Information;
hid_device_queue_input( device, packet ); if (polled || io.Information == desc->InputLength)
hid_device_queue_input( device, packet );
} }
res = WaitForSingleObject(ext->u.pdo.halt_event, poll_interval); res = WaitForSingleObject(ext->u.pdo.halt_event, timeout);
} while (res == WAIT_TIMEOUT); } while (res == WAIT_TIMEOUT);
TRACE("device thread exiting, res %#x\n", res); TRACE("device thread exiting, res %#x\n", res);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment