From 124f4620f9a1af0135526d7fb54f99d1f89d671a Mon Sep 17 00:00:00 2001 From: Loic Coenen Date: Sun, 3 May 2026 18:56:14 +0000 Subject: [PATCH] fix: allocate AppState on heap to prevent stack overflow Co-authored-by: aider (deepseek/deepseek-coder) --- main.c | 52 +++++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/main.c b/main.c index e038b84..ffcddb6 100644 --- a/main.c +++ b/main.c @@ -71,49 +71,51 @@ int main(int argc, char *argv[]) { } } - // Create initial state - AppState initial_state; - memset(&initial_state, 0, sizeof(AppState)); - initial_state.transport_state = TRANSPORT_STOPPED; - initial_state.clock_source = CLOCK_SOURCE_INTERNAL; - initial_state.bpm = 120.0; - initial_state.quantize_mode = QUANTIZE_OFF; - initial_state.quantize_threshold = 0; - initial_state.running = true; + // Create initial state (heap-allocated to avoid stack overflow) + AppState *initial_state = calloc(1, sizeof(AppState)); + if (!initial_state) { + fprintf(stderr, "Failed to allocate initial state\n"); + return 1; + } + initial_state->transport_state = TRANSPORT_STOPPED; + initial_state->clock_source = CLOCK_SOURCE_INTERNAL; + initial_state->bpm = 120.0; + initial_state->quantize_mode = QUANTIZE_OFF; + initial_state->quantize_threshold = 0; + initial_state->running = true; for (int i = 0; i < MAX_CLIPS; i++) { - initial_state.clips[i].state = CLIP_EMPTY; - initial_state.clips[i].buffer = (float *)calloc(MAX_BUFFER_SIZE, sizeof(float)); - if (!initial_state.clips[i].buffer) { + initial_state->clips[i].state = CLIP_EMPTY; + initial_state->clips[i].buffer = (float *)calloc(MAX_BUFFER_SIZE, sizeof(float)); + if (!initial_state->clips[i].buffer) { fprintf(stderr, "Failed to allocate buffer for clip %d\n", i); // Cleanup previously allocated buffers for (int j = 0; j < i; j++) { - free(initial_state.clips[j].buffer); + free(initial_state->clips[j].buffer); } + free(initial_state); return 1; } - initial_state.clips[i].buffer_size = 0; - initial_state.clips[i].write_position = 0; - initial_state.clips[i].read_position = 0; + initial_state->clips[i].buffer_size = 0; + initial_state->clips[i].write_position = 0; + initial_state->clips[i].read_position = 0; // Initialize MIDI clips - initial_state.midi_clips[i].state = CLIP_EMPTY; - initial_state.midi_clips[i].event_count = 0; - initial_state.midi_clips[i].read_index = 0; + initial_state->midi_clips[i].state = CLIP_EMPTY; + initial_state->midi_clips[i].event_count = 0; + initial_state->midi_clips[i].read_index = 0; } // Initialize channel names for (int ch = 0; ch < MAX_CHANNELS; ch++) { - snprintf(initial_state.channel_names[ch], 64, "Channel %d", ch); + snprintf(initial_state->channel_names[ch], 64, "Channel %d", ch); } - initial_state.show_midi_grid = false; + initial_state->show_midi_grid = false; // Carla host is now initialized in engine_init // Initialize dispatcher - dispatch = dispatcher_init(&initial_state); - - // Free the heap-allocated initial state - // (dispatcher_init copies the state via memcpy) + dispatch = dispatcher_init(initial_state); + free(initial_state); // Initialize filesystem module (auto-save thread) fs_init(&initial_state);