diff options
| author | Dean <Dean@d5102386-fcda-11dd-9fdb-3debd5008f28> | 2009-08-11 08:36:25 +0000 |
|---|---|---|
| committer | Dean <Dean@d5102386-fcda-11dd-9fdb-3debd5008f28> | 2009-08-11 08:36:25 +0000 |
| commit | c71c323865e261fe2764e69fa74ec190a6031f53 (patch) | |
| tree | 6f71190fd54d08e547634c1d2e8c4cdcd1947c5f /LUFA | |
| parent | c78729d67a363508145c74ef67b193ad17ea01cd (diff) | |
Fixed swapped paremeters in the HID state memory copy call while processing a HID PUSH item in the HID report parser.
Fixed memory corruption HID report parser when too many COLLECTION or PUSH items were processed.
Make RNDIS device class driver include the CDC device class driver header, so that it can inherrit the required CDC functional descriptor macro.
Make HID host class driver include the HID report parser.
git-svn-id: http://lufa-lib.googlecode.com/svn/trunk@732 d5102386-fcda-11dd-9fdb-3debd5008f28
Diffstat (limited to 'LUFA')
| -rw-r--r-- | LUFA/Drivers/USB/Class/Common/RNDIS.h | 1 | ||||
| -rw-r--r-- | LUFA/Drivers/USB/Class/Host/HID.c | 14 | ||||
| -rw-r--r-- | LUFA/Drivers/USB/Class/Host/HID.h | 5 | ||||
| -rw-r--r-- | LUFA/Drivers/USB/Class/Host/HIDParser.c | 75 | ||||
| -rw-r--r-- | LUFA/ManPages/ChangeLog.txt | 2 | ||||
| -rw-r--r-- | LUFA/ManPages/LUFAPoweredProjects.txt | 1 |
6 files changed, 51 insertions, 47 deletions
diff --git a/LUFA/Drivers/USB/Class/Common/RNDIS.h b/LUFA/Drivers/USB/Class/Common/RNDIS.h index 5c875b7d..88ee04f4 100644 --- a/LUFA/Drivers/USB/Class/Common/RNDIS.h +++ b/LUFA/Drivers/USB/Class/Common/RNDIS.h @@ -37,6 +37,7 @@ /* Includes: */
#include "../../USB.h"
+ #include "CDC.h"
#include <string.h>
diff --git a/LUFA/Drivers/USB/Class/Host/HID.c b/LUFA/Drivers/USB/Class/Host/HID.c index 3a4faffb..a42f8afa 100644 --- a/LUFA/Drivers/USB/Class/Host/HID.c +++ b/LUFA/Drivers/USB/Class/Host/HID.c @@ -127,11 +127,21 @@ void HID_Host_USBTask(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo) }
-void HID_Host_IsReportReceived(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo)
+bool HID_Host_IsReportReceived(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo)
{
+ bool ReportReceived;
+
+ if ((USB_HostState != HOST_STATE_Configured) || !(HIDInterfaceInfo->State.Active))
+ return false;
+
Pipe_SelectPipe(HIDInterfaceInfo->Config.DataINPipeNumber);
+ Pipe_Unfreeze();
+
+ ReportReceived = Pipe_IsReadWriteAllowed();
+
+ Pipe_Freeze();
- return Pipe_IsReadWriteAllowed();
+ return ReportReceived;
}
#endif
diff --git a/LUFA/Drivers/USB/Class/Host/HID.h b/LUFA/Drivers/USB/Class/Host/HID.h index 0386881d..e67103a6 100644 --- a/LUFA/Drivers/USB/Class/Host/HID.h +++ b/LUFA/Drivers/USB/Class/Host/HID.h @@ -47,6 +47,7 @@ /* Includes: */
#include "../../USB.h"
#include "../Common/HID.h"
+ #include "HIDParser.h"
/* Enable C linkage for C++ Compilers: */
#if defined(__cplusplus)
@@ -95,14 +96,14 @@ HID_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor */
HID_ENUMERROR_NoHIDInterfaceFound = 2, /**< A compatible HID interface was not found in the device's Configuration Descriptor */
HID_ENUMERROR_EndpointsNotFound = 3, /**< Compatible HID endpoints were not found in the device's CDC interface */
- } CDCHost_EnumerationFailure_ErrorCodes_t;
+ } HIDHost_EnumerationFailure_ErrorCodes_t;
/* Function Prototypes: */
void HID_Host_USBTask(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo);
uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint16_t ConfigDescriptorLength,
uint8_t* DeviceConfigDescriptor);
- void HID_Host_IsReportReceived(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo);
+ bool HID_Host_IsReportReceived(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo);
/* Private Interface - For use in library only: */
#if !defined(__DOXYGEN__)
diff --git a/LUFA/Drivers/USB/Class/Host/HIDParser.c b/LUFA/Drivers/USB/Class/Host/HIDParser.c index cee602a3..7ec003f2 100644 --- a/LUFA/Drivers/USB/Class/Host/HIDParser.c +++ b/LUFA/Drivers/USB/Class/Host/HIDParser.c @@ -36,44 +36,53 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID_ReportInfo_t* const ParserData)
{
HID_StateTable_t StateTable[HID_STATETABLE_STACK_DEPTH];
- HID_StateTable_t* CurrStateTable = &StateTable[0];
+ HID_StateTable_t* CurrStateTable = &StateTable[0];
uint16_t UsageStack[HID_USAGE_STACK_DEPTH];
- uint8_t UsageStackSize = 0;
- uint16_t BitOffsetIn = 0;
- uint16_t BitOffsetOut = 0;
+ uint8_t UsageStackSize = 0;
+ uint16_t BitOffsetIn = 0;
+ uint16_t BitOffsetOut = 0;
#if defined(HID_ENABLE_FEATURE_PROCESSING)
- uint16_t BitOffsetFeature = 0;
+ uint16_t BitOffsetFeature = 0;
#endif
- HID_CollectionPath_t* CurrCollectionPath = NULL;
+ HID_CollectionPath_t* CurrCollectionPath = NULL;
- memset((void*)ParserData, 0x00, sizeof(HID_ReportInfo_t));
- memset((void*)StateTable, 0x00, sizeof(StateTable));
+ memset(ParserData, 0x00, sizeof(HID_ReportInfo_t));
+ memset(StateTable, 0x00, sizeof(StateTable));
while (ReportSize)
{
+ uint8_t HIDReportItem = *(ReportData++);
uint32_t ReportItemData = 0;
- switch (*ReportData & DATA_SIZE_MASK)
+ ReportSize--;
+
+ switch (HIDReportItem & DATA_SIZE_MASK)
{
case DATA_SIZE_4:
- ReportItemData = *((uint32_t*)(ReportData + 1));
+ ReportItemData = *((uint32_t*)ReportData);
+ ReportSize -= 4;
+ ReportData += 4;
break;
case DATA_SIZE_2:
- ReportItemData = *((uint16_t*)(ReportData + 1));
+ ReportItemData = *((uint16_t*)ReportData);
+ ReportSize -= 2;
+ ReportData += 2;
break;
case DATA_SIZE_1:
- ReportItemData = *((uint8_t*)(ReportData + 1));
+ ReportItemData = *((uint8_t*)ReportData);
+ ReportSize -= 1;
+ ReportData += 1;
break;
}
- switch (*ReportData & (TYPE_MASK | TAG_MASK))
+ switch (HIDReportItem & (TYPE_MASK | TAG_MASK))
{
case (TYPE_GLOBAL | TAG_GLOBAL_PUSH):
- if (CurrStateTable == &StateTable[HID_STATETABLE_STACK_DEPTH])
+ if (CurrStateTable == &StateTable[HID_STATETABLE_STACK_DEPTH - 1])
return HID_PARSE_HIDStackOverflow;
- memcpy((CurrStateTable - 1),
- CurrStateTable,
+ memcpy(CurrStateTable,
+ (CurrStateTable + 1),
sizeof(HID_ReportItem_t));
CurrStateTable++;
@@ -113,7 +122,7 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID break;
case (TYPE_GLOBAL | TAG_GLOBAL_REPORTID):
CurrStateTable->ReportID = ReportItemData;
- BitOffsetIn = 0;
+ BitOffsetIn = 0;
BitOffsetOut = 0;
break;
case (TYPE_LOCAL | TAG_LOCAL_USAGE):
@@ -141,7 +150,7 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID while (CurrCollectionPath->Parent != NULL);
{
- if (CurrCollectionPath == &ParserData->CollectionPaths[HID_MAX_COLLECTIONS])
+ if (CurrCollectionPath == &ParserData->CollectionPaths[HID_MAX_COLLECTIONS - 1])
return HID_PARSE_InsufficientCollectionPaths;
CurrCollectionPath++;
@@ -209,7 +218,7 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID CurrReportItem->Attributes.Usage.Usage = 0;
}
- switch (*ReportData & TAG_MASK)
+ switch (HIDReportItem & TAG_MASK)
{
case TAG_MAIN_INPUT:
CurrReportItem->ItemType = REPORT_ITEM_TYPE_In;
@@ -236,11 +245,11 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID #endif
}
-#if !defined(HID_INCLUDE_CONSTANT_DATA_ITEMS)
+#if defined(HID_INCLUDE_CONSTANT_DATA_ITEMS)
+ ParserData->TotalReportItems++;
+#else
if (!(ReportItemData & IOF_CONSTANT))
ParserData->TotalReportItems++;
-#else
- ParserData->TotalReportItems++;
#endif
}
@@ -249,32 +258,12 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID break;
}
- if ((*ReportData & TYPE_MASK) == TYPE_MAIN)
+ if ((HIDReportItem & TYPE_MASK) == TYPE_MAIN)
{
CurrStateTable->Attributes.Usage.MinMax.Minimum = 0;
CurrStateTable->Attributes.Usage.MinMax.Maximum = 0;
UsageStackSize = 0;
}
-
- switch (*ReportData & DATA_SIZE_MASK)
- {
- case DATA_SIZE_4:
- ReportSize -= 5;
- ReportData += 5;
- break;
- case DATA_SIZE_2:
- ReportSize -= 3;
- ReportData += 3;
- break;
- case DATA_SIZE_1:
- ReportSize -= 2;
- ReportData += 2;
- break;
- case DATA_SIZE_0:
- ReportSize -= 1;
- ReportData += 1;
- break;
- }
}
return HID_PARSE_Successful;
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index ed397697..a28c0d65 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -15,6 +15,8 @@ * <b>Fixed:</b>
* - Fixed possible lockup in the CDC device class driver, when the host sends data that is a multiple of the
* endpoint's bank
+ * - Fixed swapped paremeters in the HID state memory copy call while processing a HID PUSH item in the HID report parser
+ * - Fixed memory corruption HID report parser when too many COLLECTION or PUSH items were processed
*
*
* \section Sec_ChangeLog090810 Version 090810
diff --git a/LUFA/ManPages/LUFAPoweredProjects.txt b/LUFA/ManPages/LUFAPoweredProjects.txt index 97174912..dad5c9b9 100644 --- a/LUFA/ManPages/LUFAPoweredProjects.txt +++ b/LUFA/ManPages/LUFAPoweredProjects.txt @@ -32,6 +32,7 @@ *
* - Bicycle POV: http://www.code.google.com/p/bicycleledpov/
* - CAMTRIG, a remote Camera Trigger device: http://code.astraw.com/projects/motmot/camtrig
+ * - "Fingerlicking Wingdinger" (WARNING: Bad Language if no Javascript), a MIDI controller - http://noisybox.net/electronics/wingdinger/
* - Opendous-JTAG, an open source JTAG device: http://code.google.com/p/opendous-jtag/
* - Openkubus, an open source hardware-based authentication dongle: http://code.google.com/p/openkubus/
* - Orbee, a USB connected RGB Orb for notifications: http://www.franksworkshop.com.au/Electronics/Orbee/Orbee.htm
|
