aboutsummaryrefslogtreecommitdiffstats
path: root/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2009-08-31 07:48:32 +0000
committerDean Camera <dean@fourwalledcubicle.com>2009-08-31 07:48:32 +0000
commit7fbb75928749b74a0964ad159159066967191243 (patch)
treeac8533e4dcd4853c6a6f55f08a2e01d73ae3bf72 /LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c
parent813e6f0318090135c652eb7348b154576faa680c (diff)
downloadlufa-7fbb75928749b74a0964ad159159066967191243.tar.gz
lufa-7fbb75928749b74a0964ad159159066967191243.tar.bz2
lufa-7fbb75928749b74a0964ad159159066967191243.zip
Changed the parameters and behaviour of the USB_GetDeviceConfigDescriptor() function so that it now performs size checks and data validations internally, to simplify user code.
Diffstat (limited to 'LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c')
-rw-r--r--LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c39
1 files changed, 21 insertions, 18 deletions
diff --git a/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c b/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c
index 47982b806..4c6fbfdab 100644
--- a/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c
+++ b/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c
@@ -31,9 +31,11 @@
#include "ConfigDescriptor.h"
#if defined(USB_CAN_BE_HOST)
-uint8_t USB_GetDeviceConfigDescriptor(uint8_t ConfigNumber, uint16_t* const ConfigSizePtr, void* BufferPtr)
+uint8_t USB_GetDeviceConfigDescriptor(uint8_t ConfigNumber, uint16_t* const ConfigSizePtr,
+ void* BufferPtr, uint16_t BufferSize)
{
uint8_t ErrorCode;
+ uint8_t ConfigHeader[sizeof(USB_Descriptor_Configuration_Header_t)];
USB_ControlRequest = (USB_Request_Header_t)
{
@@ -46,26 +48,27 @@ uint8_t USB_GetDeviceConfigDescriptor(uint8_t ConfigNumber, uint16_t* const Conf
Pipe_SelectPipe(PIPE_CONTROLPIPE);
- if (BufferPtr == NULL)
- {
- uint8_t ConfigHeader[sizeof(USB_Descriptor_Configuration_Header_t)];
+ if ((ErrorCode = USB_Host_SendControlRequest(ConfigHeader)) != HOST_SENDCONTROL_Successful)
+ return ErrorCode;
- ErrorCode = USB_Host_SendControlRequest(ConfigHeader);
+ #if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES)
+ *ConfigSizePtr = DESCRIPTOR_CAST(ConfigHeader, USB_Descriptor_Configuration_Header_t).TotalConfigurationSize;
+ #else
+ *ConfigSizePtr = DESCRIPTOR_CAST(ConfigHeader, USB_Descriptor_Configuration_Header_t).wTotalLength;
+ #endif
- #if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES)
- *ConfigSizePtr = DESCRIPTOR_CAST(ConfigHeader, USB_Descriptor_Configuration_Header_t).TotalConfigurationSize;
- #else
- *ConfigSizePtr = DESCRIPTOR_CAST(ConfigHeader, USB_Descriptor_Configuration_Header_t).wTotalLength;
- #endif
- }
- else
- {
- USB_ControlRequest.wLength = *ConfigSizePtr;
-
- ErrorCode = USB_Host_SendControlRequest(BufferPtr);
- }
+ if (*ConfigSizePtr > BufferSize)
+ return HOST_GETCONFIG_BuffOverflow;
+
+ USB_ControlRequest.wLength = *ConfigSizePtr;
+
+ if ((ErrorCode = USB_Host_SendControlRequest(BufferPtr)) != HOST_SENDCONTROL_Successful)
+ return ErrorCode;
- return ErrorCode;
+ if (DESCRIPTOR_TYPE(BufferPtr) != DTYPE_Configuration)
+ return HOST_GETCONFIG_InvalidData;
+
+ return HOST_GETCONFIG_Successful;
}
#endif