Fixed HID Device Class Driver not allocating a temporary buffer when the host request...
[pub/lufa.git] / LUFA / Drivers / USB / Class / Device / HID.c
index cc1ad43..7ff3249 100644 (file)
@@ -53,11 +53,15 @@ void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInter
                                uint16_t ReportINSize = 0;\r
                                uint8_t  ReportID     = (USB_ControlRequest.wValue & 0xFF);\r
                                uint8_t  ReportType   = (USB_ControlRequest.wValue >> 8) - 1;\r
+                               uint8_t  ReportINData[HIDInterfaceInfo->Config.PrevReportINBufferSize];\r
+\r
+                               memset(ReportINData, 0, sizeof(ReportINData));\r
 \r
-                               memset(HIDInterfaceInfo->Config.PrevReportINBuffer, 0, HIDInterfaceInfo->Config.PrevReportINBufferSize);\r
-                               \r
                                CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, ReportType,\r
                                                                    HIDInterfaceInfo->Config.PrevReportINBuffer, &ReportINSize);\r
+                               \r
+                               if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL)\r
+                                 memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINData, HIDInterfaceInfo->Config.PrevReportINBufferSize);\r
 \r
                                Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);\r
                                Endpoint_Write_Control_Stream_LE(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINSize);\r
@@ -169,7 +173,7 @@ void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
                if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL)\r
                {\r
                        StatesChanged = (memcmp(ReportINData, HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINSize) != 0);\r
-                       memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINData, ReportINSize);\r
+                       memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINData, HIDInterfaceInfo->Config.PrevReportINBufferSize);\r
                }\r
 \r
                if (ReportINSize && (ForceSend || StatesChanged || IdlePeriodElapsed))\r