Commit ba6d9c1a authored by Dean Camera's avatar Dean Camera
Browse files

Fixed bootloaders accepting flash writes to the bootloader region (thanks to NicoHood).

parent 8802907c
......@@ -35,8 +35,20 @@
#include "BootloaderAPI.h"
static bool IsPageAddressValid(const uint32_t Address)
{
/* Determine if the given page address is correctly aligned to the
start of a flash page. */
bool PageAddressIsAligned = !(Address & (SPM_PAGESIZE - 1));
return (Address < BOOT_START_ADDR) && PageAddressIsAligned;
}
void BootloaderAPI_ErasePage(const uint32_t Address)
{
if (! IsPageAddressValid(Address))
return;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
boot_page_erase_safe(Address);
......@@ -47,6 +59,9 @@ void BootloaderAPI_ErasePage(const uint32_t Address)
void BootloaderAPI_WritePage(const uint32_t Address)
{
if (! IsPageAddressValid(Address))
return;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
boot_page_write_safe(Address);
......
......@@ -35,8 +35,20 @@
#include "BootloaderAPI.h"
static bool IsPageAddressValid(const uint32_t Address)
{
/* Determine if the given page address is correctly aligned to the
start of a flash page. */
bool PageAddressIsAligned = !(Address & (SPM_PAGESIZE - 1));
return (Address < BOOT_START_ADDR) && PageAddressIsAligned;
}
void BootloaderAPI_ErasePage(const uint32_t Address)
{
if (! IsPageAddressValid(Address))
return;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
boot_page_erase_safe(Address);
......@@ -47,6 +59,9 @@ void BootloaderAPI_ErasePage(const uint32_t Address)
void BootloaderAPI_WritePage(const uint32_t Address)
{
if (! IsPageAddressValid(Address))
return;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
boot_page_write_safe(Address);
......
......@@ -152,6 +152,10 @@ void EVENT_USB_Device_ControlRequest(void)
uint16_t PageAddress = Endpoint_Read_16_LE();
#endif
/* Determine if the given page address is correctly aligned to the
start of a flash page. */
bool PageAddressIsAligned = !(PageAddress & (SPM_PAGESIZE - 1));
/* Check if the command is a program page command, or a start application command */
#if (FLASHEND > 0xFFFF)
if ((uint16_t)(PageAddress >> 8) == COMMAND_STARTAPPLICATION)
......@@ -161,7 +165,7 @@ void EVENT_USB_Device_ControlRequest(void)
{
RunBootloader = false;
}
else if (PageAddress < BOOT_START_ADDR)
else if ((PageAddress < BOOT_START_ADDR) && PageAddressIsAligned)
{
/* Erase the given FLASH page, ready to be programmed */
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
......
......@@ -35,8 +35,20 @@
#include "BootloaderAPI.h"
static bool IsPageAddressValid(const uint32_t Address)
{
/* Determine if the given page address is correctly aligned to the
start of a flash page. */
bool PageAddressIsAligned = !(Address & (SPM_PAGESIZE - 1));
return (Address < BOOT_START_ADDR) && PageAddressIsAligned;
}
void BootloaderAPI_ErasePage(const uint32_t Address)
{
if (! IsPageAddressValid(Address))
return;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
boot_page_erase_safe(Address);
......@@ -47,6 +59,9 @@ void BootloaderAPI_ErasePage(const uint32_t Address)
void BootloaderAPI_WritePage(const uint32_t Address)
{
if (! IsPageAddressValid(Address))
return;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
boot_page_write_safe(Address);
......
......@@ -35,8 +35,20 @@
#include "BootloaderAPI.h"
static bool IsPageAddressValid(const uint32_t Address)
{
/* Determine if the given page address is correctly aligned to the
start of a flash page. */
bool PageAddressIsAligned = !(Address & (SPM_PAGESIZE - 1));
return (Address < BOOT_START_ADDR) && PageAddressIsAligned;
}
void BootloaderAPI_ErasePage(const uint32_t Address)
{
if (! IsPageAddressValid(Address))
return;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
boot_page_erase_safe(Address);
......@@ -47,6 +59,9 @@ void BootloaderAPI_ErasePage(const uint32_t Address)
void BootloaderAPI_WritePage(const uint32_t Address)
{
if (! IsPageAddressValid(Address))
return;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
boot_page_write_safe(Address);
......
......@@ -14,6 +14,7 @@
* character after a successful write (thanks to NicoHood)
* - Library Applications:
* - Fixed bootloaders not disabling global interrupts during erase and write operations (thanks to Zoltan)
* - Fixed bootloaders accepting flash writes to the bootloader region (thanks to NicoHood)
*
* \section Sec_ChangeLog170418 Version 170418
* <b>New:</b>
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment