SDL_mixer: initial minimal error checking to load_sbk().

From 4ba10563e02629a1855ca5cbadf16abced20f353 Mon Sep 17 00:00:00 2001
From: sezero <[EMAIL REDACTED]>
Date: Thu, 31 Jul 2025 05:56:10 +0300
Subject: [PATCH] initial minimal error checking to load_sbk().

Still LOTS TO DO.
---
 src/timidity/readsbk.c | 18 ++++++++++++++----
 src/timidity/sbk.h     |  4 ++--
 src/timidity/sndfont.c | 10 +++++++++-
 3 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/src/timidity/readsbk.c b/src/timidity/readsbk.c
index adc7bfa9..1fd61b53 100644
--- a/src/timidity/readsbk.c
+++ b/src/timidity/readsbk.c
@@ -123,13 +123,21 @@ static void debugval(const char *tag, int v)
  * load sbk file
  *----------------------------------------------------------------*/
 
-void load_sbk(SDL_IOStream *io, SFInfo *sf)
+int load_sbk(SDL_IOStream *io, SFInfo *sf)
 {
 	tchunk chunk, subchunk;
+	Sint64 len;
 
-	READID(sf->sbkh.riff, io);
-	READDW(&sf->sbkh.size, io);
-	READID(sf->sbkh.sfbk, io);
+	len = SDL_GetIOSize(io);
+	if (len < 32) /* better?? */
+		return -1;
+
+	READCHUNK(&chunk, io);
+	if (getchunk(chunk.id) != RIFF_ID) return -1;
+	if (chunk.size != len - 8) return -1;
+
+	READID(chunk.id, io);
+	if (getchunk(chunk.id) != SFBK_ID) return -1;
 
 	sf->in_rom = 1;
 	while (SDL_GetIOStatus(io) != SDL_IO_STATUS_EOF) {
@@ -142,6 +150,8 @@ void load_sbk(SDL_IOStream *io, SFInfo *sf)
 			break;
 		}
 	}
+
+	return 0;
 }
 
 
diff --git a/src/timidity/sbk.h b/src/timidity/sbk.h
index a4ec7f48..4e48f263 100644
--- a/src/timidity/sbk.h
+++ b/src/timidity/sbk.h
@@ -78,7 +78,7 @@ typedef struct _SFInfo {
 	int nrpgens, nrigens;
 	tgenrec *presetgen, *instgen;
 
-	tsbkheader sbkh;
+	/*tsbkheader sbkh;*/
 
 	/*char *sf_name;*/
 
@@ -90,7 +90,7 @@ typedef struct _SFInfo {
  * functions
  *----------------------------------------------------------------*/
 
-void load_sbk(SDL_IOStream *io, SFInfo *sf);
+int load_sbk(SDL_IOStream *io, SFInfo *sf);
 void free_sbk(SFInfo *sf);
 
 #endif
diff --git a/src/timidity/sndfont.c b/src/timidity/sndfont.c
index 110670b2..ac70c9fd 100644
--- a/src/timidity/sndfont.c
+++ b/src/timidity/sndfont.c
@@ -144,7 +144,15 @@ void init_soundfont(MidiSong *song, const char *fname, int order)
 		return;
 	}
 	sfrec.fname = SDL_strdup(fname);
-	load_sbk(sfrec.io, &sfinfo);
+	if (load_sbk(sfrec.io, &sfinfo) < 0) {
+		SNDDBG(("%s: bad soundfont file\n", fname));
+		SDL_CloseIO(sfrec.io);
+		sfrec.io = NULL;
+		SDL_free(sfrec.fname);
+		sfrec.fname = NULL;
+		free_sbk(&sfinfo);
+		return;
+	}
 
 	for (i = 0; i < sfinfo.nrpresets - 1; i++) {
 		int bank = sfinfo.presethdr[i].bank;