Skip to content
Snippets Groups Projects
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
Branches
No related tags found
No related merge requests found
......@@ -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>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment