feat: only allow flash when target matches (#4770)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user