diff --git a/port/include/system.h b/port/include/system.h index 84d568382..dc581dfb9 100644 --- a/port/include/system.h +++ b/port/include/system.h @@ -32,6 +32,7 @@ void sysGetHomePath(char *outPath, const u32 outLen); void *sysMemAlloc(const u32 size); void *sysMemZeroAlloc(const u32 size); +void *sysMemRealloc(void *ptr, const u32 newSize); void sysMemFree(void *ptr); // hns is specified in 100ns units diff --git a/port/src/preprocess/filelang.c b/port/src/preprocess/filelang.c index 841dbffe1..9869202fb 100644 --- a/port/src/preprocess/filelang.c +++ b/port/src/preprocess/filelang.c @@ -31,7 +31,7 @@ static int getNumStrings(u8 *src, size_t len) return 1; } -u32 convertLangFile(u8 *dst, u8 *src, size_t srclen) +static u32 convertLangFile(u8 *dst, u8 *src, size_t srclen) { // Convert it u32 *src_offsets = (u32 *) src; diff --git a/port/src/preprocess/segaudio.c b/port/src/preprocess/segaudio.c index 56d7e3a13..3ddbdf5f3 100644 --- a/port/src/preprocess/segaudio.c +++ b/port/src/preprocess/segaudio.c @@ -316,11 +316,22 @@ static u32 convertAudioBankFile(u8 *dst, u8 *src) u8 *preprocessALBankFile(u8 *src, u32 size, u32 *outSize) { ptrReset(); - u32 dstlen = size * 3; + + const u32 dstlen = size * 3; // this should overshoot any possible bank size, but * 2 also works for vanilla banks u8 *dst = sysMemZeroAlloc(dstlen); - *outSize = convertAudioBankFile(dst, src); - *outSize = ALIGN16(*outSize); + u32 reallen = convertAudioBankFile(dst, src); + if (reallen > dstlen || ALIGN16(reallen) > dstlen) { + sysFatalError("overflow when trying to preprocess an ALBankFile, size %u dstlen %u reallen %u", size, dstlen, reallen); + } + + reallen = ALIGN16(reallen); + + if (reallen < dstlen) { + dst = sysMemRealloc(dst, reallen); + } + + *outSize = reallen; return dst; } diff --git a/port/src/system.c b/port/src/system.c index 16b689c47..60d94f592 100644 --- a/port/src/system.c +++ b/port/src/system.c @@ -288,6 +288,11 @@ void *sysMemZeroAlloc(const u32 size) return calloc(1, size); } +void *sysMemRealloc(void *ptr, const u32 newSize) +{ + return realloc(ptr, newSize); +} + void sysMemFree(void *ptr) { free(ptr);