Proper skipping of hidden menu lines, old code accessed mstate_tab[] out of bounds (#4491)

This commit is contained in:
Damjan Adamic
2017-02-26 12:43:06 +01:00
committed by Bertrand Songis
parent 7081f924de
commit 455fc1f79f
+19 -5
View File
@@ -82,6 +82,24 @@ void onTelemetryScriptFileSelectionMenu(const char *result)
}
#endif
int skipHiddenLines(int noRows, const uint8_t * mstate_tab, int Row)
{
for(int i=0; i<noRows; ++i) {
if (mstate_tab[i] != HIDDEN_ROW) {
if (Row == 0) {
// TRACE("%d -> %d", Row, i);
return i;
}
--Row;
}
}
return -1;
}
// #define SKIP_HIDDEN_MENU_ROWS(row) row = skipHiddenLines((int)DIM(mstate_tab), mstate_tab, row); if (row < 0) return;
#define SKIP_HIDDEN_MENU_ROWS(row) if ((row = skipHiddenLines((int)DIM(mstate_tab), mstate_tab, row)) < 0) return;
void menuModelDisplay(event_t event)
{
MENU(STR_MENU_DISPLAY, menuTabModel, MENU_MODEL_DISPLAY, HEADER_LINE + ITEM_DISPLAY_MAX, { HEADER_LINE_COLUMNS TELEMETRY_SCREEN_ROWS(0), TELEMETRY_SCREEN_ROWS(1), TELEMETRY_SCREEN_ROWS(2), TELEMETRY_SCREEN_ROWS(3) });
@@ -91,11 +109,7 @@ void menuModelDisplay(event_t event)
for (uint8_t i=0; i<NUM_BODY_LINES; i++) {
coord_t y = MENU_HEADER_HEIGHT + 1 + i*FH;
int k = i + menuVerticalOffset;
for (int j=0; j<=k; j++) {
if (mstate_tab[j+HEADER_LINE] == HIDDEN_ROW) {
k++;
}
}
SKIP_HIDDEN_MENU_ROWS(k);
LcdFlags blink = ((s_editMode>0) ? BLINK|INVERS : INVERS);
LcdFlags attr = (sub == k ? blink : 0);