Fix crash announcing menu strings past the voice-prompt table

voicePromptsAppendLanguageString() turns a language-string pointer into a
prompt index (NUM_VOICE_PROMPTS + offset), and voicePromptsPlay() then reads
tableOfContents[index + 1]. Strings added after the voice-prompt pack was
built (the SMS menu entries) land past the 368-entry table, so the player
read off the end of the array and the radio crashed when the Messages menu
announced a submenu name with voice prompts enabled.

Clamp any index at or beyond the last table slot to PROMPT_SILENCE, so such
strings are simply not spoken. Also protects the pre-existing strings sitting
at the very end of the table.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Marcus Kida 2026-07-13 17:31:09 +02:00
parent d07d3c4b9c
commit 9eceb10013
2 changed files with 19 additions and 3 deletions

View file

@ -7,7 +7,11 @@ single running list until the first versioned release.
## Unreleased
_Nothing yet._
- **Fix:** the radio **crashed** when navigating the Messages menu with voice
prompts enabled. Menu strings added after the voice-prompt pack was built map
to a table-of-contents slot that doesn't exist; the player read past the end
of the table. Such strings now play silence instead (also hardens the
pre-existing strings sitting at the end of the table).
## 0.7.0

View file

@ -352,13 +352,25 @@ void voicePromptsAppendLanguageString(const char *languageStringAdd)
return;
}
voicePromptsAppendPrompt(NUM_VOICE_PROMPTS +
int promptNumber = NUM_VOICE_PROMPTS +
((languageStringAdd - currentLanguage->LANGUAGE_NAME)
#if ! defined(HAS_COLOURS)
- ((languageStringAdd >= currentLanguage->theme_chooser) ?
((currentLanguage->theme_colour_picker_blue - currentLanguage->theme_chooser) + LANGUAGE_TEXTS_LENGTH) : 0)
#endif
) / LANGUAGE_TEXTS_LENGTH);
) / LANGUAGE_TEXTS_LENGTH;
// Language strings added after the voice prompt pack was built have no
// entry in the table of contents. voicePromptsPlay() reads TOC[promptNumber + 1],
// so anything at or past the last slot would read past the array and crash;
// play silence for those instead.
if ((promptNumber < 0) || (promptNumber >= (VOICE_PROMPTS_TOC_SIZE - 1)))
{
voicePromptsAppendPrompt(PROMPT_SILENCE);
return;
}
voicePromptsAppendPrompt(promptNumber);
}
void voicePromptsPlay(void)