feat: only allow flash when target matches (#4770)

This commit is contained in:
3djc
2024-03-25 10:42:29 +10:00
committed by GitHub
parent d055b8045d
commit 4628ccce9e
5 changed files with 88 additions and 45 deletions
+9 -1
View File
@@ -43,7 +43,15 @@ bool isBootloader(const char * filename)
return false;
}
return isBootloaderStart(buffer);
// Check firmware is for this radio
for (int i = 0; i < 1024; i++) {
if (memcmp(buffer + i, FLAVOUR, sizeof(FLAVOUR) - 1) == 0) {
if (buffer[i + sizeof(FLAVOUR) - 1] == '-')
return isBootloaderStart(buffer);;
return false;
}
}
return false;
}
void BootloaderFirmwareUpdate::flashFirmware(const char * filename, ProgressHandler progressHandler)
@@ -140,16 +140,21 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str)
memset(&tag, 0, sizeof(tag));
extractFirmwareVersion(&tag);
lcd->drawText(168, 138, TR_BL_FORK, RIGHT | BL_FOREGROUND);
lcd->drawSizedText(174, 138, tag.fork, 6, BL_FOREGROUND);
if (strcmp(tag.flavour, FLAVOUR)) {
lcd->drawText(94, 168, LV_SYMBOL_CLOSE " " TR_BL_INVALID_FIRMWARE,
BL_FOREGROUND);
} else {
lcd->drawText(168, 138, TR_BL_FORK, RIGHT | BL_FOREGROUND);
lcd->drawSizedText(174, 138, tag.fork, 6, BL_FOREGROUND);
lcd->drawText(168, 158, TR_BL_VERSION, RIGHT | BL_FOREGROUND);
lcd->drawText(174, 158, tag.version, BL_FOREGROUND);
lcd->drawText(168, 158, TR_BL_VERSION, RIGHT | BL_FOREGROUND);
lcd->drawText(174, 158, tag.version, BL_FOREGROUND);
lcd->drawText(168, 178, TR_BL_RADIO, RIGHT | BL_FOREGROUND);
lcd->drawText(174, 178, tag.flavour, BL_FOREGROUND);
lcd->drawText(168, 178, TR_BL_RADIO, RIGHT | BL_FOREGROUND);
lcd->drawText(174, 178, tag.flavour, BL_FOREGROUND);
lcd->drawText(78, 158, LV_SYMBOL_OK, BL_GREEN);
lcd->drawText(78, 158, LV_SYMBOL_OK, BL_GREEN);
}
}
}
+23 -18
View File
@@ -167,27 +167,32 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str)
memset(&tag, 0, sizeof(tag));
extractFirmwareVersion(&tag);
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING,
MESSAGE_TOP - DEFAULT_PADDING,
TR_BL_FORK, RIGHT | BL_FOREGROUND);
lcd->drawSizedText(LCD_W / 4 + 6 + DEFAULT_PADDING,
MESSAGE_TOP - DEFAULT_PADDING, tag.fork, 6,
BL_FOREGROUND);
if (strcmp(tag.flavour, FLAVOUR)) {
lcd->drawText(20, MESSAGE_TOP, LV_SYMBOL_CLOSE " " TR_BL_INVALID_FIRMWARE,
BL_FOREGROUND);
} else {
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING,
MESSAGE_TOP - DEFAULT_PADDING,
TR_BL_FORK, RIGHT | BL_FOREGROUND);
lcd->drawSizedText(LCD_W / 4 + 6 + DEFAULT_PADDING,
MESSAGE_TOP - DEFAULT_PADDING, tag.fork, 6,
BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, MESSAGE_TOP,
TR_BL_VERSION, RIGHT | BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, MESSAGE_TOP,
tag.version, BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, MESSAGE_TOP,
TR_BL_VERSION, RIGHT | BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, MESSAGE_TOP,
tag.version, BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING,
MESSAGE_TOP + DEFAULT_PADDING,
TR_BL_RADIO, RIGHT | BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING,
MESSAGE_TOP + DEFAULT_PADDING, tag.flavour,
BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING,
MESSAGE_TOP + DEFAULT_PADDING,
TR_BL_RADIO, RIGHT | BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING,
MESSAGE_TOP + DEFAULT_PADDING, tag.flavour,
BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING - 90, MESSAGE_TOP,
LV_SYMBOL_OK, BL_GREEN);
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING - 90, MESSAGE_TOP,
LV_SYMBOL_OK, BL_GREEN);
}
}
}
+22 -18
View File
@@ -187,27 +187,31 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str)
VersionTag tag;
memset(&tag, 0, sizeof(tag));
extractFirmwareVersion(&tag);
if (strcmp(tag.flavour, FLAVOUR)) {
lcd->drawText(20, MESSAGE_TOP, LV_SYMBOL_CLOSE " " TR_BL_INVALID_FIRMWARE,
BL_FOREGROUND);
} else {
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING,
MESSAGE_TOP - DEFAULT_PADDING,
TR_BL_FORK, RIGHT | BL_FOREGROUND);
lcd->drawSizedText(LCD_W / 4 + 6 + DEFAULT_PADDING,
MESSAGE_TOP - DEFAULT_PADDING, tag.fork, 6,
BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING,
MESSAGE_TOP - DEFAULT_PADDING,
TR_BL_FORK, RIGHT | BL_FOREGROUND);
lcd->drawSizedText(LCD_W / 4 + 6 + DEFAULT_PADDING,
MESSAGE_TOP - DEFAULT_PADDING, tag.fork, 6,
BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, MESSAGE_TOP,
TR_BL_VERSION, RIGHT | BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, MESSAGE_TOP,
tag.version, BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, MESSAGE_TOP,
TR_BL_VERSION, RIGHT | BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, MESSAGE_TOP,
tag.version, BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING,
MESSAGE_TOP + DEFAULT_PADDING,
TR_BL_RADIO, RIGHT | BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING,
MESSAGE_TOP + DEFAULT_PADDING, tag.flavour,
BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING,
MESSAGE_TOP + DEFAULT_PADDING,
TR_BL_RADIO, RIGHT | BL_FOREGROUND);
lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING,
MESSAGE_TOP + DEFAULT_PADDING, tag.flavour,
BL_FOREGROUND);
lcd->drawText(DOUBLE_PADDING, MESSAGE_TOP, LV_SYMBOL_OK, BL_GREEN);
lcd->drawText(DOUBLE_PADDING, MESSAGE_TOP, LV_SYMBOL_OK, BL_GREEN);
}
}
}
@@ -52,6 +52,19 @@ void bootloaderDrawFilename(const char *str, uint8_t line, bool selected)
bootloaderDrawMsg(INDENT_WIDTH, str, line, selected);
}
bool checkFirmwareFlavor(const char * vers)
{
if (strncmp(vers,FLAVOUR, sizeof(FLAVOUR) - 1) != 0)
return false;
char * tmp = (char *) vers;
while (*tmp != '-') tmp++;
if ((tmp - vers) != (sizeof(FLAVOUR) - 1))
return false;
return true;
}
void bootloaderDrawScreen(BootloaderState st, int opt, const char *str)
{
lcdClear();
@@ -98,16 +111,24 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char *str)
bootloaderDrawMsg(0, TR_BL_INVALID_EEPROM, 2, false);
}
else if (opt == FC_OK) {
bool flavorCheck = false;
if (memoryType == MEM_FLASH) {
const char * vers = getFirmwareVersion((const char *)Block_buffer);
#if LCD_W < 212
// Remove "edgetx-" from string
if (strncmp(vers, "edgetx-", 7) == 0)
vers += 7;
flavorCheck = checkFirmwareFlavor(vers);
#else
flavorCheck = checkFirmwareFlavor(vers + 7);
#endif
bootloaderDrawMsg(INDENT_WIDTH, vers, 0, false);
}
bootloaderDrawMsg(0, TR_BL_HOLD_ENTER_TO_START, 2, false);
if (flavorCheck)
bootloaderDrawMsg(0, TR_BL_HOLD_ENTER_TO_START, 2, false);
else
bootloaderDrawMsg(0, TR_BL_INVALID_FIRMWARE, 2, false);
}
}
else if (st == ST_FLASHING) {