aboutsummaryrefslogtreecommitdiffstats
path: root/Bootloaders
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2015-11-08 14:48:35 +1100
committerDean Camera <dean@fourwalledcubicle.com>2015-11-08 14:50:24 +1100
commit6b06bc6237ccd63a268f82752d6b6c0265a77571 (patch)
tree2383843107fbfcd6e9e02a82a1c9f52c5d119a7b /Bootloaders
parent4afebc8b70672e7a860606ba6e2496314265f1d9 (diff)
downloadlufa-6b06bc6237ccd63a268f82752d6b6c0265a77571.tar.gz
lufa-6b06bc6237ccd63a268f82752d6b6c0265a77571.tar.bz2
lufa-6b06bc6237ccd63a268f82752d6b6c0265a77571.zip
Fixed missing bounds checks and off-by-one in the DFU bootloader signature bytes (thanks to Reuti)
Diffstat (limited to 'Bootloaders')
-rw-r--r--Bootloaders/DFU/BootloaderDFU.c37
1 files changed, 31 insertions, 6 deletions
diff --git a/Bootloaders/DFU/BootloaderDFU.c b/Bootloaders/DFU/BootloaderDFU.c
index cfe368d32..4a0d73043 100644
--- a/Bootloaders/DFU/BootloaderDFU.c
+++ b/Bootloaders/DFU/BootloaderDFU.c
@@ -818,18 +818,43 @@ static void ProcessReadCommand(void)
const uint8_t BootloaderInfo[3] = {BOOTLOADER_VERSION, BOOTLOADER_ID_BYTE1, BOOTLOADER_ID_BYTE2};
const uint8_t SignatureInfo[4] = {0x58, AVR_SIGNATURE_1, AVR_SIGNATURE_2, AVR_SIGNATURE_3};
- uint8_t DataIndexToRead = SentCommand.Data[1];
+ uint8_t DataIndexToRead = SentCommand.Data[1];
+ bool ReadAddressInvalid = false;
if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00)) // Read bootloader info
{
- ResponseByte = BootloaderInfo[DataIndexToRead];
+ if (DataIndexToRead < 3)
+ ResponseByte = BootloaderInfo[DataIndexToRead];
+ else
+ ReadAddressInvalid = true;
}
else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Read signature byte
{
- if (DataIndexToRead < 0x60)
- ResponseByte = SignatureInfo[DataIndexToRead - 0x30];
- else
- ResponseByte = SignatureInfo[DataIndexToRead - 0x60 + 3];
+ switch (DataIndexToRead)
+ {
+ case 0x30:
+ ResponseByte = SignatureInfo[0];
+ break;
+ case 0x31:
+ ResponseByte = SignatureInfo[1];
+ break;
+ case 0x60:
+ ResponseByte = SignatureInfo[2];
+ break;
+ case 0x61:
+ ResponseByte = SignatureInfo[3];
+ break;
+ default:
+ ReadAddressInvalid = true;
+ break;
+ }
+ }
+
+ if (ReadAddressInvalid)
+ {
+ /* Set the state and status variables to indicate the error */
+ DFU_State = dfuERROR;
+ DFU_Status = errADDRESS;
}
}