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;