diff --git a/right/src/config_parser/config_globals.c b/right/src/config_parser/config_globals.c index e923267..4207681 100644 --- a/right/src/config_parser/config_globals.c +++ b/right/src/config_parser/config_globals.c @@ -12,6 +12,11 @@ config_buffer_t ValidatedUserConfigBuffer = { validatedUserConfig }; bool ParserRunDry; +bool IsConfigBufferIdValid(config_buffer_id_t configBufferId) +{ + return ConfigBufferId_HardwareConfig <= configBufferId && configBufferId <= ConfigBufferId_ValidatedUserConfig; +} + config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId) { switch (configBufferId) { @@ -25,3 +30,16 @@ config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId) return NULL; } } + +uint16_t ConfigBufferIdToBufferSize(config_buffer_id_t configBufferId) +{ + switch (configBufferId) { + case ConfigBufferId_HardwareConfig: + return HARDWARE_CONFIG_SIZE; + case ConfigBufferId_StagingUserConfig: + case ConfigBufferId_ValidatedUserConfig: + return USER_CONFIG_SIZE; + default: + return 0; + } +} diff --git a/right/src/config_parser/config_globals.h b/right/src/config_parser/config_globals.h index 1bd5464..3cc5dde 100644 --- a/right/src/config_parser/config_globals.h +++ b/right/src/config_parser/config_globals.h @@ -23,6 +23,8 @@ // Functions: + bool IsConfigBufferIdValid(config_buffer_id_t configBufferId); config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId); + uint16_t ConfigBufferIdToBufferSize(config_buffer_id_t configBufferId); #endif diff --git a/right/src/usb_commands/usb_command_read_config.c b/right/src/usb_commands/usb_command_read_config.c index 3a8e6a7..cb1cbf2 100644 --- a/right/src/usb_commands/usb_command_read_config.c +++ b/right/src/usb_commands/usb_command_read_config.c @@ -3,23 +3,28 @@ #include "usb_protocol_handler.h" #include "eeprom.h" -void UsbCommand_ReadConfig(bool isHardware) +void UsbCommand_ReadConfig() { - uint8_t length = GetUsbRxBufferUint8(1); - uint16_t offset = GetUsbRxBufferUint16(2); + config_buffer_id_t configBufferId = GetUsbRxBufferUint8(1); + uint8_t length = GetUsbRxBufferUint8(2); + uint16_t offset = GetUsbRxBufferUint16(3); + + if (!IsConfigBufferIdValid(configBufferId)) { + SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_InvalidConfigBufferId); + } if (length > USB_GENERIC_HID_OUT_BUFFER_LENGTH - USB_STATUS_CODE_SIZE) { SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_LengthTooLarge); return; } - uint8_t *buffer = isHardware ? HardwareConfigBuffer.buffer : ValidatedUserConfigBuffer.buffer; - uint16_t bufferLength = isHardware ? HARDWARE_CONFIG_SIZE : USER_CONFIG_SIZE; + config_buffer_t *buffer = ConfigBufferIdToConfigBuffer(configBufferId); + uint16_t bufferLength = ConfigBufferIdToBufferSize(configBufferId); if (offset + length > bufferLength) { SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_BufferOutOfBounds); return; } - memcpy(GenericHidOutBuffer + USB_STATUS_CODE_SIZE, buffer + offset, length); + memcpy(GenericHidOutBuffer + USB_STATUS_CODE_SIZE, buffer->buffer + offset, length); } diff --git a/right/src/usb_commands/usb_command_read_config.h b/right/src/usb_commands/usb_command_read_config.h index 21b0eea..889d3ec 100644 --- a/right/src/usb_commands/usb_command_read_config.h +++ b/right/src/usb_commands/usb_command_read_config.h @@ -3,13 +3,14 @@ // Functions: - void UsbCommand_ReadConfig(bool isHardware); + void UsbCommand_ReadConfig(); // Typedefs: typedef enum { - UsbStatusCode_ReadConfig_LengthTooLarge = 2, - UsbStatusCode_ReadConfig_BufferOutOfBounds = 3, + UsbStatusCode_ReadConfig_InvalidConfigBufferId = 2, + UsbStatusCode_ReadConfig_LengthTooLarge = 3, + UsbStatusCode_ReadConfig_BufferOutOfBounds = 4, } usb_status_code_read_config_t; #endif diff --git a/right/src/usb_protocol_handler.c b/right/src/usb_protocol_handler.c index bbecd49..f4e6e70 100644 --- a/right/src/usb_protocol_handler.c +++ b/right/src/usb_protocol_handler.c @@ -43,13 +43,10 @@ void UsbProtocolHandler(void) case UsbCommandId_LaunchEepromTransferLegacy: UsbCommand_LaunchEepromTransferLegacy(); break; - case UsbCommandId_ReadHardwareConfig: - UsbCommand_ReadConfig(true); + case UsbCommandId_ReadConfig: + UsbCommand_ReadConfig(); break; case UsbCommandId_WriteHardwareConfig: - UsbCommand_WriteConfig(true); - break; - case UsbCommandId_ReadUserConfig: UsbCommand_ReadConfig(false); break; case UsbCommandId_GetKeyboardState: diff --git a/right/src/usb_protocol_handler.h b/right/src/usb_protocol_handler.h index e2dc12d..98beabb 100644 --- a/right/src/usb_protocol_handler.h +++ b/right/src/usb_protocol_handler.h @@ -19,9 +19,7 @@ UsbCommandId_JumpToModuleBootloader = 0x02, // was 0x12 UsbCommandId_SendKbootCommandToModule = 0x03, // was 0x13 - UsbCommandId_ReadHardwareConfig = 0x0D, - UsbCommandId_ReadUserConfig = 0x0F, - // use ReadConfig instead of the above 2 + UsbCommandId_ReadConfig = 0x04, // was 0x0d and 0x0f UsbCommandId_WriteHardwareConfig = 0x0E, UsbCommandId_WriteUserConfig = 0x08, UsbCommandId_ApplyConfig = 0x09,