Skip to content

Commit 58d457b

Browse files
authored
fix(radio): potential crash if too many telemetry sensors discovered (#6288)
1 parent dc0d85d commit 58d457b

File tree

6 files changed

+33
-27
lines changed

6 files changed

+33
-27
lines changed

radio/src/gui/128x64/model_telemetry.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ void menuModelTelemetry(event_t event)
214214
pushMenu(menuModelSensor);
215215
}
216216
else {
217-
allowNewSensors = 0;
217+
allowNewSensors = false;
218218
POPUP_WARNING(STR_TELEMETRYFULL);
219219
}
220220
}

radio/src/gui/212x64/model_telemetry.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ void menuModelTelemetry(event_t event)
218218
pushMenu(menuModelSensor);
219219
}
220220
else {
221-
allowNewSensors = 0;
221+
allowNewSensors = false;
222222
POPUP_WARNING(STR_TELEMETRYFULL);
223223
}
224224
}

radio/src/gui/colorlcd/model/model_telemetry.cpp

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -773,25 +773,26 @@ void ModelTelemetryPage::checkEvents()
773773
{
774774
int _lastKnownIndex = availableTelemetryIndex();
775775

776-
if (lastKnownIndex >= 0 && lastKnownIndex != _lastKnownIndex) {
777-
rebuild(window);
776+
if (_lastKnownIndex < 0) {
777+
if (discover->checked()) {
778+
buildSensorList(-1);
779+
discover->setText(STR_DISCOVER_SENSORS);
780+
discover->check(false);
781+
POPUP_WARNING(STR_TELEMETRYFULL);
782+
}
783+
} else if (lastKnownIndex != _lastKnownIndex) {
784+
buildSensorList(-1);
778785
lastKnownIndex = _lastKnownIndex;
779786
}
780787

781788
PageTab::checkEvents();
782789
}
783790

784-
void ModelTelemetryPage::rebuild(Window* window, int8_t focusSensorIndex)
785-
{
786-
buildSensorList(focusSensorIndex);
787-
lastKnownIndex = availableTelemetryIndex();
788-
}
789-
790-
void ModelTelemetryPage::editSensor(Window* window, uint8_t index)
791+
void ModelTelemetryPage::editSensor(uint8_t index)
791792
{
792793
lastKnownIndex = -1;
793794
Window* editWindow = new SensorEditWindow(index);
794-
editWindow->setCloseHandler([=]() { rebuild(window, index); });
795+
editWindow->setCloseHandler([=]() { buildSensorList(index); });
795796
}
796797

797798
void ModelTelemetryPage::buildSensorList(int8_t focusSensorIndex)
@@ -809,7 +810,7 @@ void ModelTelemetryPage::buildSensorList(int8_t focusSensorIndex)
809810

810811
button->setPressHandler([=]() -> uint8_t {
811812
Menu* menu = new Menu();
812-
menu->addLine(STR_EDIT, [=]() { editSensor(window, idx); });
813+
menu->addLine(STR_EDIT, [=]() { editSensor(idx); });
813814
menu->addLine(STR_COPY, [=]() {
814815
auto newIndex = availableTelemetryIndex();
815816
if (newIndex >= 0) {
@@ -820,26 +821,26 @@ void ModelTelemetryPage::buildSensorList(int8_t focusSensorIndex)
820821
TelemetryItem& newItem = telemetryItems[newIndex];
821822
newItem = sourceItem;
822823
SET_DIRTY();
823-
rebuild(window, newIndex);
824+
buildSensorList(newIndex);
824825
} else {
825-
new FullScreenDialog(WARNING_TYPE_ALERT, "", STR_TELEMETRYFULL);
826+
POPUP_WARNING(STR_TELEMETRYFULL);
826827
}
827828
});
828829
menu->addLine(STR_DELETE, [=]() {
829830
delTelemetryIndex(idx); // calls setDirty internally
830831
for (uint8_t i = idx + 1; i < MAX_TELEMETRY_SENSORS; i += 1) {
831832
if (g_model.telemetrySensors[i].isAvailable()) {
832-
rebuild(window, i);
833+
buildSensorList(i);
833834
return;
834835
}
835836
}
836837
for (int8_t i = idx - 1; i >= 0; i -= 1) {
837838
if (g_model.telemetrySensors[i].isAvailable()) {
838-
rebuild(window, i);
839+
buildSensorList(i);
839840
return;
840841
}
841842
}
842-
rebuild(window, -1);
843+
buildSensorList(-1);
843844
});
844845
return 0;
845846
});
@@ -859,6 +860,11 @@ void ModelTelemetryPage::buildSensorList(int8_t focusSensorIndex)
859860

860861
uint8_t sensorsCount = getTelemetrySensorsCount();
861862
deleteAll->show(sensorsCount > 0);
863+
864+
if (availableTelemetryIndex() >= 0)
865+
lastKnownIndex = availableTelemetryIndex();
866+
else
867+
lastKnownIndex = MAX_TELEMETRY_SENSORS;
862868
}
863869

864870
void ModelTelemetryPage::build(Window* window)
@@ -867,8 +873,6 @@ void ModelTelemetryPage::build(Window* window)
867873
window->padBottom(PAD_LARGE);
868874
window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_ZERO);
869875

870-
this->window = window;
871-
872876
// Sensors
873877
new Subtitle(window, STR_TELEMETRY_SENSORS);
874878

@@ -902,9 +906,9 @@ void ModelTelemetryPage::build(Window* window)
902906
new TextButton(line, rect_t{}, STR_TELEMETRY_NEWSENSOR, [=]() -> uint8_t {
903907
int idx = availableTelemetryIndex();
904908
if (idx >= 0)
905-
editSensor(window, idx);
909+
editSensor(idx);
906910
else
907-
new FullScreenDialog(WARNING_TYPE_ALERT, "", STR_TELEMETRYFULL);
911+
POPUP_WARNING(STR_TELEMETRYFULL);
908912
return 0;
909913
});
910914
lv_obj_set_grid_cell(b->getLvObj(), LV_GRID_ALIGN_STRETCH, 1, 1,

radio/src/gui/colorlcd/model/model_telemetry.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,12 @@ class ModelTelemetryPage : public PageTab
3737

3838
protected:
3939
int lastKnownIndex = 0;
40-
Window* window = nullptr;
4140
Window* sensorWindow = nullptr;
4241
TextButton* discover = nullptr;
4342
TextButton* deleteAll = nullptr;
4443

4544
void checkEvents() override;
4645

47-
void editSensor(Window* window, uint8_t index);
48-
void rebuild(Window* window, int8_t focusSensorIndex = -1);
46+
void editSensor(uint8_t index);
4947
void buildSensorList(int8_t focusSensorIndex = -1);
5048
};

radio/src/telemetry/telemetry_sensors.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
#endif
5757

5858
TelemetryItem telemetryItems[MAX_TELEMETRY_SENSORS];
59-
uint8_t allowNewSensors;
59+
bool allowNewSensors;
6060

6161
bool isFaiForbidden(source_t idx)
6262
{
@@ -597,7 +597,11 @@ int setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t subId,
597597
return index;
598598
}
599599
else {
600+
allowNewSensors = false;
601+
#if !defined(COLORLCD)
602+
// Not safe on color LCD - handled in telemetry page instead
600603
POPUP_WARNING(STR_TELEMETRYFULL);
604+
#endif
601605
return -1;
602606
}
603607
}

radio/src/telemetry/telemetry_sensors.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,5 +130,5 @@ class TelemetryItem
130130
};
131131

132132
extern TelemetryItem telemetryItems[MAX_TELEMETRY_SENSORS];
133-
extern uint8_t allowNewSensors;
133+
extern bool allowNewSensors;
134134
bool isFaiForbidden(source_t idx);

0 commit comments

Comments
 (0)