diff --git a/locales/en/messages.json b/locales/en/messages.json index df26e79a..4d27d9fc 100644 --- a/locales/en/messages.json +++ b/locales/en/messages.json @@ -2818,6 +2818,14 @@ "firmwareFlasherHexCorrupted": { "message": "HEX file appears to be corrupted" }, + "firmwareFlasherConfigCorrupted": { + "message": "Config file appears to be corrupted, ASCII accepted (chars 0-255)", + "description": "shown in the progress bar at the bottom, be brief" + }, + "firmwareFlasherConfigCorruptedLogMessage": { + "message": "Config file appears to be corrupted, ASCII accepted (chars 0-255), characters outside of this range are allowed as comments", + "description": "shown in the log, more wordy" + }, "firmwareFlasherRemoteFirmwareLoaded": { "message": "Remote Firmware loaded, ready for flashing" }, diff --git a/src/js/tabs/firmware_flasher.js b/src/js/tabs/firmware_flasher.js index 6927e8ad..4a0f2882 100644 --- a/src/js/tabs/firmware_flasher.js +++ b/src/js/tabs/firmware_flasher.js @@ -612,6 +612,28 @@ TABS.firmware_flasher.initialize = function (callback) { self.flashingMessage(i18n.getMessage('firmwareFlasherFirmwareLocalLoaded', self.parsed_hex.bytes_total), self.FLASH_MESSAGE_TYPES.NEUTRAL); } } + function cleanUnifiedConfigFile(input) { + let output = []; + let inComment = false; + for (let i=0; i < input.length; i++) { + if (input.charAt(i) == "\n" || input.charAt(i) == "\r") { + inComment = false; + } + if (input.charAt(i) == "#") { + inComment = true; + } + if (!inComment && input.charCodeAt(i) > 255) { + // Note: we're not showing this error in betaflight-configurator + throw new Error('commands are limited to characters 0-255, comments have no limitation'); + } + if (input.charCodeAt(i) > 255) { + output.push('_'); + } else { + output.push(input.charAt(i)); + } + } + return output.join(''); + } // UI Hooks $('a.load_file').click(function () { self.enableFlashing(false); @@ -666,10 +688,15 @@ TABS.firmware_flasher.initialize = function (callback) { }); } else { clearBufferedFirmware(); - self.unifiedTargetConfig = e.target.result; - self.unifiedTargetConfigName = file.name; - self.isConfigLocal = true; - flashingMessageLocal(); + try { + self.unifiedTargetConfig = cleanUnifiedConfigFile(e.target.result); + self.unifiedTargetConfigName = file.name; + self.isConfigLocal = true; + flashingMessageLocal(); + } catch(err) { + self.flashingMessage('firmwareFlasherConfigCorrupted', self.FLASH_MESSAGE_TYPES.INVALID); + GUI.log(i18n.getMessage('firmwareFlasherConfigCorruptedLogMessage')); + } } } };