From 617c90053ca3fec9e8effe956f1c4a503b122652 Mon Sep 17 00:00:00 2001
From: sezero <[EMAIL REDACTED]>
Date: Thu, 31 Jul 2025 05:56:10 +0300
Subject: [PATCH] timidity.c: fix memory leaks in Timidity_FreeSong() when
using soundfonts,
call end_soundfont() in Timidity_Exit().
---
src/timidity/timidity.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/src/timidity/timidity.c b/src/timidity/timidity.c
index 21b13559..fcf24c21 100644
--- a/src/timidity/timidity.c
+++ b/src/timidity/timidity.c
@@ -679,13 +679,23 @@ MidiSong *Timidity_LoadSong(SDL_IOStream *io, const SDL_AudioSpec *audio)
void Timidity_FreeSong(MidiSong *song)
{
- int i;
+ int i, j;
if (!song) return;
free_instruments(song);
for (i = 0; i < 128; i++) {
+ if (!master_tonebank[i] && song->tonebank[i]) { /* might be alloc'ed by sndfont */
+ for (j = 0; j < 128; j++)
+ SDL_free(song->tonebank[i]->tone[j].name);
+ SDL_free(song->tonebank[i]->tone);
+ }
+ if (!master_drumset[i] && song->drumset[i]) { /* might be alloc'ed by sndfont */
+ for (j = 0; j < 128; j++)
+ SDL_free(song->drumset[i]->tone[j].name);
+ SDL_free(song->drumset[i]->tone);
+ }
SDL_free(song->tonebank[i]);
SDL_free(song->drumset[i]);
}
@@ -726,6 +736,7 @@ void Timidity_Exit(void)
}
}
+ end_soundfont();
SDL_free(sf_file);
sf_file = NULL;
sf_order = 0;