#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);
void BootloaderAPI_WritePage(const uint32_t Address)
{
+ if (! IsPageAddressValid(Address))
+ return;
+
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
boot_page_write_safe(Address);
#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);
void BootloaderAPI_WritePage(const uint32_t Address)
{
+ if (! IsPageAddressValid(Address))
+ return;
+
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
boot_page_write_safe(Address);
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)
{
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)
#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);
void BootloaderAPI_WritePage(const uint32_t Address)
{
+ if (! IsPageAddressValid(Address))
+ return;
+
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
boot_page_write_safe(Address);
#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);
void BootloaderAPI_WritePage(const uint32_t Address)
{
+ if (! IsPageAddressValid(Address))
+ return;
+
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
boot_page_write_safe(Address);
* 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>