From c09d4278c3c5d4331d8c345d1933593c6575600c Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 5 Jul 2015 18:26:19 +0200 Subject: [PATCH] Fixes #2420: input name buffer overflow in Companion (ported from master) --- companion/releasenotes.txt | 3 ++- companion/src/modeledit/expodialog.cpp | 11 ++++++----- companion/src/modeledit/expodialog.h | 5 +++-- companion/src/modeledit/inputs.cpp | 11 +++++------ 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/companion/releasenotes.txt b/companion/releasenotes.txt index 03cd9ad05..fd46126be 100644 --- a/companion/releasenotes.txt +++ b/companion/releasenotes.txt @@ -12,6 +12,7 @@
  • File path issue in Taranis simulator function findTrueFileName() on Windows (#2301)
  • Added simulator volume gain setting (#2260)
  • Added GPS glitch filtering and Latitude/Longitude position synchronization to Google Earth export (#2326)
  • +
  • Fixed a rare program crash when editing Input for 9X radio (#2420)
  • @@ -320,4 +321,4 @@
  • Try to reduce modeledit window form MAC
  • Wrong init of RF-Module data
  • Read flash from TX didn't worked for Taranis
  • - \ No newline at end of file + diff --git a/companion/src/modeledit/expodialog.cpp b/companion/src/modeledit/expodialog.cpp index d64c0887c..10007c394 100644 --- a/companion/src/modeledit/expodialog.cpp +++ b/companion/src/modeledit/expodialog.cpp @@ -2,7 +2,8 @@ #include "ui_expodialog.h" #include "helpers.h" -ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, GeneralSettings & generalSettings, Firmware * firmware, char * inputName) : +ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, GeneralSettings & generalSettings, + Firmware * firmware, QString & inputName) : QDialog(parent), ui(new Ui::ExpoDialog), model(model), @@ -62,6 +63,8 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, G ui->inputName->setMaxLength(4); populateSourceCB(ui->sourceCB, ed->srcRaw, generalSettings, &model, POPULATE_NONE | POPULATE_SOURCES | POPULATE_SWITCHES | POPULATE_TRIMS | POPULATE_TELEMETRY); ui->sourceCB->removeItem(0); + ui->inputName->setValidator(new QRegExpValidator(rx, this)); + ui->inputName->setText(inputName); } else { ui->inputNameLabel->hide(); @@ -87,9 +90,6 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, G ui->lineName->setMaxLength(expolength); } - ui->inputName->setValidator(new QRegExpValidator(rx, this)); - ui->inputName->setText(inputName); - ui->lineName->setValidator(new QRegExpValidator(rx, this)); ui->lineName->setText(ed->name); @@ -153,7 +153,8 @@ void ExpoDialog::valuesChanged() ed->mode = ui->sideCB->currentIndex() + 1; strcpy(ed->name, ui->lineName->text().toAscii().data()); - strcpy(inputName, ui->inputName->text().toAscii().data()); + if (firmware->getCapability(VirtualInputs)) + inputName = ui->inputName->text(); ed->phases=0; for (int i=8; i>=0 ; i--) { diff --git a/companion/src/modeledit/expodialog.h b/companion/src/modeledit/expodialog.h index 5f683bf69..b4b40f803 100644 --- a/companion/src/modeledit/expodialog.h +++ b/companion/src/modeledit/expodialog.h @@ -14,7 +14,8 @@ namespace Ui { class ExpoDialog : public QDialog { Q_OBJECT public: - ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expodata, GeneralSettings & generalSettings, Firmware * firmware, char * inputName); + ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expodata, GeneralSettings & generalSettings, + Firmware * firmware, QString & inputName); ~ExpoDialog(); protected: @@ -30,7 +31,7 @@ class ExpoDialog : public QDialog { GeneralSettings & generalSettings; Firmware * firmware; ExpoData * ed; - char * inputName; + QString & inputName; GVarGroup * gvWeightGroup; GVarGroup * gvOffsetGroup; CurveGroup * curveGroup; diff --git a/companion/src/modeledit/inputs.cpp b/companion/src/modeledit/inputs.cpp index a3b7dcc10..9d5580672 100644 --- a/companion/src/modeledit/inputs.cpp +++ b/companion/src/modeledit/inputs.cpp @@ -216,19 +216,18 @@ void InputsPanel::gm_openExpo(int index) if(index<0 || index>=C9X_MAX_EXPOS) return; ExpoData mixd(model->expoData[index]); - char inputName[4+1]; emit modified(); update(); - - if (firmware->getCapability(VirtualInputs)) { - strcpy(inputName, model->inputNames[mixd.chn]); - } + + QString inputName; + if (firmware->getCapability(VirtualInputs)) + inputName = model->inputNames[mixd.chn]; ExpoDialog *g = new ExpoDialog(this, *model, &mixd, generalSettings, firmware, inputName); if (g->exec()) { model->expoData[index] = mixd; if (firmware->getCapability(VirtualInputs)) - strcpy(model->inputNames[mixd.chn], inputName); + strncpy(model->inputNames[mixd.chn], inputName.toAscii().data(), 4); emit modified(); update(); }