fix: prevent hang in scene add/remove test and fix unsafe scene copy

Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
This commit is contained in:
Loic Coenen
2026-05-10 18:34:26 +00:00
parent 4dfb7a87c1
commit 1ba98fc768
2 changed files with 65 additions and 11 deletions

View File

@@ -91,9 +91,18 @@ void channel_remove_scene(jack_client_t *client, int idx) {
if (cur[idx].scene_count <= 1)
return;
int cs = cur[idx].current_scene;
/* shift remaining scenes down */
/* shift remaining scenes down (safe copy of fields) */
for (int i = cs; i < cur[idx].scene_count - 1; i++) {
cur[idx].scenes[i] = cur[idx].scenes[i + 1];
cur[idx].scenes[i].loop_count = cur[idx].scenes[i+1].loop_count;
cur[idx].scenes[i].record_pos = cur[idx].scenes[i+1].record_pos;
cur[idx].scenes[i].playback_pos = cur[idx].scenes[i+1].playback_pos;
atomic_store(&cur[idx].scenes[i].state,
atomic_load(&cur[idx].scenes[i+1].state));
cur[idx].scenes[i].prev_state = cur[idx].scenes[i+1].prev_state;
/* copy loop data */
memcpy(cur[idx].scenes[i].loop.audio_buffer,
cur[idx].scenes[i+1].loop.audio_buffer,
LOOP_BUF_SIZE * sizeof(float));
}
cur[idx].scene_count--;
if (cur[idx].current_scene >= cur[idx].scene_count)