Skip to content

Commit 4628ccc

Browse files
authored
feat: only allow flash when target matches (#4770)
1 parent d055b80 commit 4628ccc

File tree

5 files changed

+94
-51
lines changed

5 files changed

+94
-51
lines changed

radio/src/io/bootloader_flash.cpp

+9-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,15 @@ bool isBootloader(const char * filename)
4343
return false;
4444
}
4545

46-
return isBootloaderStart(buffer);
46+
// Check firmware is for this radio
47+
for (int i = 0; i < 1024; i++) {
48+
if (memcmp(buffer + i, FLAVOUR, sizeof(FLAVOUR) - 1) == 0) {
49+
if (buffer[i + sizeof(FLAVOUR) - 1] == '-')
50+
return isBootloaderStart(buffer);;
51+
return false;
52+
}
53+
}
54+
return false;
4755
}
4856

4957
void BootloaderFirmwareUpdate::flashFirmware(const char * filename, ProgressHandler progressHandler)

radio/src/targets/horus/bootloader/boot_menu.cpp

+12-7
Original file line numberDiff line numberDiff line change
@@ -140,16 +140,21 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str)
140140
memset(&tag, 0, sizeof(tag));
141141
extractFirmwareVersion(&tag);
142142

143-
lcd->drawText(168, 138, TR_BL_FORK, RIGHT | BL_FOREGROUND);
144-
lcd->drawSizedText(174, 138, tag.fork, 6, BL_FOREGROUND);
143+
if (strcmp(tag.flavour, FLAVOUR)) {
144+
lcd->drawText(94, 168, LV_SYMBOL_CLOSE " " TR_BL_INVALID_FIRMWARE,
145+
BL_FOREGROUND);
146+
} else {
147+
lcd->drawText(168, 138, TR_BL_FORK, RIGHT | BL_FOREGROUND);
148+
lcd->drawSizedText(174, 138, tag.fork, 6, BL_FOREGROUND);
145149

146-
lcd->drawText(168, 158, TR_BL_VERSION, RIGHT | BL_FOREGROUND);
147-
lcd->drawText(174, 158, tag.version, BL_FOREGROUND);
150+
lcd->drawText(168, 158, TR_BL_VERSION, RIGHT | BL_FOREGROUND);
151+
lcd->drawText(174, 158, tag.version, BL_FOREGROUND);
148152

149-
lcd->drawText(168, 178, TR_BL_RADIO, RIGHT | BL_FOREGROUND);
150-
lcd->drawText(174, 178, tag.flavour, BL_FOREGROUND);
153+
lcd->drawText(168, 178, TR_BL_RADIO, RIGHT | BL_FOREGROUND);
154+
lcd->drawText(174, 178, tag.flavour, BL_FOREGROUND);
151155

152-
lcd->drawText(78, 158, LV_SYMBOL_OK, BL_GREEN);
156+
lcd->drawText(78, 158, LV_SYMBOL_OK, BL_GREEN);
157+
}
153158
}
154159
}
155160

radio/src/targets/nv14/bootloader/boot_menu.cpp

+26-21
Original file line numberDiff line numberDiff line change
@@ -167,27 +167,32 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str)
167167
memset(&tag, 0, sizeof(tag));
168168
extractFirmwareVersion(&tag);
169169

170-
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING,
171-
MESSAGE_TOP - DEFAULT_PADDING,
172-
TR_BL_FORK, RIGHT | BL_FOREGROUND);
173-
lcd->drawSizedText(LCD_W / 4 + 6 + DEFAULT_PADDING,
174-
MESSAGE_TOP - DEFAULT_PADDING, tag.fork, 6,
175-
BL_FOREGROUND);
176-
177-
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, MESSAGE_TOP,
178-
TR_BL_VERSION, RIGHT | BL_FOREGROUND);
179-
lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, MESSAGE_TOP,
180-
tag.version, BL_FOREGROUND);
181-
182-
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING,
183-
MESSAGE_TOP + DEFAULT_PADDING,
184-
TR_BL_RADIO, RIGHT | BL_FOREGROUND);
185-
lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING,
186-
MESSAGE_TOP + DEFAULT_PADDING, tag.flavour,
187-
BL_FOREGROUND);
188-
189-
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING - 90, MESSAGE_TOP,
190-
LV_SYMBOL_OK, BL_GREEN);
170+
if (strcmp(tag.flavour, FLAVOUR)) {
171+
lcd->drawText(20, MESSAGE_TOP, LV_SYMBOL_CLOSE " " TR_BL_INVALID_FIRMWARE,
172+
BL_FOREGROUND);
173+
} else {
174+
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING,
175+
MESSAGE_TOP - DEFAULT_PADDING,
176+
TR_BL_FORK, RIGHT | BL_FOREGROUND);
177+
lcd->drawSizedText(LCD_W / 4 + 6 + DEFAULT_PADDING,
178+
MESSAGE_TOP - DEFAULT_PADDING, tag.fork, 6,
179+
BL_FOREGROUND);
180+
181+
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, MESSAGE_TOP,
182+
TR_BL_VERSION, RIGHT | BL_FOREGROUND);
183+
lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, MESSAGE_TOP,
184+
tag.version, BL_FOREGROUND);
185+
186+
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING,
187+
MESSAGE_TOP + DEFAULT_PADDING,
188+
TR_BL_RADIO, RIGHT | BL_FOREGROUND);
189+
lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING,
190+
MESSAGE_TOP + DEFAULT_PADDING, tag.flavour,
191+
BL_FOREGROUND);
192+
193+
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING - 90, MESSAGE_TOP,
194+
LV_SYMBOL_OK, BL_GREEN);
195+
}
191196
}
192197
}
193198

radio/src/targets/pl18/bootloader/boot_menu.cpp

+25-21
Original file line numberDiff line numberDiff line change
@@ -187,27 +187,31 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str)
187187
VersionTag tag;
188188
memset(&tag, 0, sizeof(tag));
189189
extractFirmwareVersion(&tag);
190-
191-
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING,
192-
MESSAGE_TOP - DEFAULT_PADDING,
193-
TR_BL_FORK, RIGHT | BL_FOREGROUND);
194-
lcd->drawSizedText(LCD_W / 4 + 6 + DEFAULT_PADDING,
195-
MESSAGE_TOP - DEFAULT_PADDING, tag.fork, 6,
196-
BL_FOREGROUND);
197-
198-
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, MESSAGE_TOP,
199-
TR_BL_VERSION, RIGHT | BL_FOREGROUND);
200-
lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, MESSAGE_TOP,
201-
tag.version, BL_FOREGROUND);
202-
203-
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING,
204-
MESSAGE_TOP + DEFAULT_PADDING,
205-
TR_BL_RADIO, RIGHT | BL_FOREGROUND);
206-
lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING,
207-
MESSAGE_TOP + DEFAULT_PADDING, tag.flavour,
208-
BL_FOREGROUND);
209-
210-
lcd->drawText(DOUBLE_PADDING, MESSAGE_TOP, LV_SYMBOL_OK, BL_GREEN);
190+
if (strcmp(tag.flavour, FLAVOUR)) {
191+
lcd->drawText(20, MESSAGE_TOP, LV_SYMBOL_CLOSE " " TR_BL_INVALID_FIRMWARE,
192+
BL_FOREGROUND);
193+
} else {
194+
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING,
195+
MESSAGE_TOP - DEFAULT_PADDING,
196+
TR_BL_FORK, RIGHT | BL_FOREGROUND);
197+
lcd->drawSizedText(LCD_W / 4 + 6 + DEFAULT_PADDING,
198+
MESSAGE_TOP - DEFAULT_PADDING, tag.fork, 6,
199+
BL_FOREGROUND);
200+
201+
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, MESSAGE_TOP,
202+
TR_BL_VERSION, RIGHT | BL_FOREGROUND);
203+
lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, MESSAGE_TOP,
204+
tag.version, BL_FOREGROUND);
205+
206+
lcd->drawText(LCD_W / 4 + DEFAULT_PADDING,
207+
MESSAGE_TOP + DEFAULT_PADDING,
208+
TR_BL_RADIO, RIGHT | BL_FOREGROUND);
209+
lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING,
210+
MESSAGE_TOP + DEFAULT_PADDING, tag.flavour,
211+
BL_FOREGROUND);
212+
213+
lcd->drawText(DOUBLE_PADDING, MESSAGE_TOP, LV_SYMBOL_OK, BL_GREEN);
214+
}
211215
}
212216
}
213217

radio/src/targets/taranis/bootloader/boot_menu.cpp

+22-1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,19 @@ void bootloaderDrawFilename(const char *str, uint8_t line, bool selected)
5252
bootloaderDrawMsg(INDENT_WIDTH, str, line, selected);
5353
}
5454

55+
bool checkFirmwareFlavor(const char * vers)
56+
{
57+
if (strncmp(vers,FLAVOUR, sizeof(FLAVOUR) - 1) != 0)
58+
return false;
59+
60+
char * tmp = (char *) vers;
61+
while (*tmp != '-') tmp++;
62+
if ((tmp - vers) != (sizeof(FLAVOUR) - 1))
63+
return false;
64+
65+
return true;
66+
}
67+
5568
void bootloaderDrawScreen(BootloaderState st, int opt, const char *str)
5669
{
5770
lcdClear();
@@ -98,16 +111,24 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char *str)
98111
bootloaderDrawMsg(0, TR_BL_INVALID_EEPROM, 2, false);
99112
}
100113
else if (opt == FC_OK) {
114+
bool flavorCheck = false;
101115
if (memoryType == MEM_FLASH) {
102116
const char * vers = getFirmwareVersion((const char *)Block_buffer);
103117
#if LCD_W < 212
104118
// Remove "edgetx-" from string
105119
if (strncmp(vers, "edgetx-", 7) == 0)
106120
vers += 7;
121+
flavorCheck = checkFirmwareFlavor(vers);
122+
#else
123+
flavorCheck = checkFirmwareFlavor(vers + 7);
107124
#endif
125+
108126
bootloaderDrawMsg(INDENT_WIDTH, vers, 0, false);
109127
}
110-
bootloaderDrawMsg(0, TR_BL_HOLD_ENTER_TO_START, 2, false);
128+
if (flavorCheck)
129+
bootloaderDrawMsg(0, TR_BL_HOLD_ENTER_TO_START, 2, false);
130+
else
131+
bootloaderDrawMsg(0, TR_BL_INVALID_FIRMWARE, 2, false);
111132
}
112133
}
113134
else if (st == ST_FLASHING) {

0 commit comments

Comments
 (0)