From 6ec693c0a1bd077ac69ca43146971f92d3010513 Mon Sep 17 00:00:00 2001 From: Jeod <47716344+JeodC@users.noreply.github.com> Date: Sat, 30 May 2026 10:52:15 -0400 Subject: [PATCH] Fix use-after-free crash in audio synthesis on level reset (#133) --- src/audio/external.c | 5 +++++ src/port/Engine.cpp | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/src/audio/external.c b/src/audio/external.c index 1b71105fe..cfbe334bf 100644 --- a/src/audio/external.c +++ b/src/audio/external.c @@ -2622,7 +2622,11 @@ void play_toads_jingle(void) { /** * Called from threads: thread5_game_loop */ +void GameEngine_LockAudioThread(void); +void GameEngine_UnlockAudioThread(void); + void sound_reset(u8 presetId) { + GameEngine_LockAudioThread(); #ifndef VERSION_JP if (presetId >= 8) { presetId = 0; @@ -2651,6 +2655,7 @@ void sound_reset(u8 presetId) { D_80332108 = (D_80332108 & 0xf0) + presetId; gSoundMode = D_80332108 >> 4; sHasStartedFadeOut = FALSE; + GameEngine_UnlockAudioThread(); } /** diff --git a/src/port/Engine.cpp b/src/port/Engine.cpp index 50d0d374c..f1501e6e5 100644 --- a/src/port/Engine.cpp +++ b/src/port/Engine.cpp @@ -1182,6 +1182,14 @@ void GameEngine::EndAudioFrame() { } } +extern "C" void GameEngine_LockAudioThread() { + audio.mutex.lock(); +} + +extern "C" void GameEngine_UnlockAudioThread() { + audio.mutex.unlock(); +} + void GameEngine::AudioInit() { const auto resourceMgr = Ship::Context::GetInstance()->GetResourceManager(); resourceMgr->LoadResources("sound");