diff --git a/arm9/source/config.c b/arm9/source/config.c index ab91dbf6..5f54fb36 100644 --- a/arm9/source/config.c +++ b/arm9/source/config.c @@ -694,7 +694,7 @@ static size_t saveLumaIniConfigToStr(char *out) return n < 0 ? 0 : (size_t)n; } -static char tmpIniBuffer[0x2000]; +static char tmpIniBuffer[0x2000 + 0x400]; // eyeballed. TODO use #embed static bool readLumaIniConfig(void) { @@ -709,6 +709,13 @@ static bool readLumaIniConfig(void) static bool writeLumaIniConfig(void) { size_t n = saveLumaIniConfigToStr(tmpIniBuffer); + + // FIXME: this is UB we should port snprintf sometime (as well as fix other tech debt) + if (n + 1 >= sizeof(tmpIniBuffer)) { + error("Configuration data buffer overflow, please report this issue"); + __builtin_unreachable(); + } + return n != 0 && fileWrite(tmpIniBuffer, "config.ini", n); } diff --git a/sysmodules/rosalina/include/utils.h b/sysmodules/rosalina/include/utils.h index d9e77394..810caedb 100644 --- a/sysmodules/rosalina/include/utils.h +++ b/sysmodules/rosalina/include/utils.h @@ -30,6 +30,7 @@ #include <3ds/srv.h> #include <3ds/result.h> #include <3ds/ipc.h> +#include #include "csvc.h" #include "luma_shared_config.h" diff --git a/sysmodules/rosalina/source/luma_config.c b/sysmodules/rosalina/source/luma_config.c index 5b877474..7e949ecc 100644 --- a/sysmodules/rosalina/source/luma_config.c +++ b/sysmodules/rosalina/source/luma_config.c @@ -204,7 +204,7 @@ void LumaConfig_RequestSaveSettings(void) { Result LumaConfig_SaveSettings(void) { - char inibuf[0x2000]; + char inibuf[0x2000 + 0x400]; // eyeballed. TODO use #embed Result res; @@ -259,6 +259,12 @@ Result LumaConfig_SaveSettings(void) configData.autobootCtrAppmemtype = autobootCtrAppmemtype; size_t n = LumaConfig_SaveLumaIniConfigToStr(inibuf, &configData); + + // FIXME: this is UB we should port snprintf sometime (as well as fix other tech debt in Rosalina) + if (n + 1 >= sizeof(inibuf)) { + __builtin_trap(); + } + FS_ArchiveID archiveId = isSdMode ? ARCHIVE_SDMC : ARCHIVE_NAND_RW; if (n > 0) res = IFile_Open(&file, archiveId, fsMakePath(PATH_EMPTY, ""), fsMakePath(PATH_ASCII, "/luma/config.ini"), FS_OPEN_CREATE | FS_OPEN_WRITE);