From 1192896188754bc9c8787c70445f386fce5c82b9 Mon Sep 17 00:00:00 2001 From: Julian Uy Date: Sat, 20 Jun 2026 10:49:29 -0500 Subject: [PATCH] change: avoid using sprintf and strcat for EE and host code --- ee/elf-loader/src/loader/src/loader.c | 10 +++-- ee/erl/src/erl.c | 9 ++--- ee/graph/src/graph_config.c | 56 +++++++++++++-------------- ee/kernel/src/iopcontrol.c | 3 +- ee/libcglue/src/timezone.c | 4 +- ee/rpc/hdd/src/libhdd.c | 16 ++++---- tools/romimg/src/main.c | 4 +- tools/srxfixup/src/elfdump.c | 21 ++++------ tools/srxfixup/src/elflib.c | 6 +-- tools/srxfixup/src/readconf.c | 6 ++- tools/srxfixup/src/srxgen.c | 10 ++--- 11 files changed, 69 insertions(+), 76 deletions(-) diff --git a/ee/elf-loader/src/loader/src/loader.c b/ee/elf-loader/src/loader/src/loader.c index 16b6520d098b..c95d085f7a52 100644 --- a/ee/elf-loader/src/loader/src/loader.c +++ b/ee/elf-loader/src/loader/src/loader.c @@ -96,10 +96,12 @@ int main(int argc, char *argv[]) } char *new_argv[argc - 1]; - int fullPath_length = 1 + strlen(argv[0]) + strlen(argv[1]); - char fullPath[fullPath_length]; - strcpy(fullPath, argv[0]); - strcat(fullPath, argv[1]); + int argv0_len = strlen(argv[0]); + int argv1_len = strlen(argv[1]); + char fullPath[argv0_len + argv1_len + 1]; + memcpy(&fullPath[0], argv[0], argv0_len); + memcpy(&fullPath[argv0_len], argv[1], argv1_len); + fullPath[argv0_len + argv1_len] = 0; // final new_argv[0] is partition + path to elf new_argv[0] = fullPath; for (i = 2; i < argc; i++) { diff --git a/ee/erl/src/erl.c b/ee/erl/src/erl.c index b4c4bc052e82..194b7d50ab4e 100644 --- a/ee/erl/src/erl.c +++ b/ee/erl/src/erl.c @@ -957,8 +957,7 @@ typedef int (*start_t)(int argc, char ** argv); static struct erl_record_t * _init_load_erl_wrapper_from_file(char * erl_id) { char tmpnam[256]; - strcpy(tmpnam, erl_id); - strcat(tmpnam, ".erl"); + snprintf(tmpnam, sizeof(tmpnam), "%s.erl", erl_id); return _init_load_erl_from_file(tmpnam, erl_id); } @@ -1049,8 +1048,7 @@ struct erl_record_t * _init_load_erl_from_file(const char * fname, char * erl_id argv[0] = erl_id; argv[1] = 0; - strcpy(tfname, _init_erl_prefix); - strcat(tfname, fname); + snprintf(tfname, sizeof(tfname), "%s%s", _init_erl_prefix, fname); return load_erl_from_file(tfname, 1, argv); } @@ -1093,8 +1091,7 @@ struct erl_record_t * _init_load_erl_from_file_to_addr(const char * fname, u32 a argv[0] = erl_id; argv[1] = 0; - strcpy(tfname, _init_erl_prefix); - strcat(tfname, fname); + snprintf(tfname, sizeof(tfname), "%s%s", _init_erl_prefix, fname); return load_erl_from_file_to_addr(tfname, addr, 1, argv); } diff --git a/ee/graph/src/graph_config.c b/ee/graph/src/graph_config.c index cb33e435d388..576b3b49ef27 100644 --- a/ee/graph/src/graph_config.c +++ b/ee/graph/src/graph_config.c @@ -12,28 +12,28 @@ int graph_make_config(int mode, int interlace, int ffmd, int x, int y, int flick switch (mode) { - case GRAPH_MODE_NTSC: sprintf(config, "GRAPH_MODE_NTSC:"); break; - case GRAPH_MODE_PAL: sprintf(config, "GRAPH_MODE_PAL:"); break; - case GRAPH_MODE_HDTV_480P: sprintf(config, "GRAPH_MODE_HDTV_480P:"); break; - case GRAPH_MODE_HDTV_576P: sprintf(config, "GRAPH_MODE_HDTV_576P:"); break; - case GRAPH_MODE_HDTV_720P: sprintf(config, "GRAPH_MODE_HDTV_720P:"); break; - case GRAPH_MODE_HDTV_1080I: sprintf(config, "GRAPH_MODE_HDTV_1080I:"); break; - case GRAPH_MODE_VGA_640_60: sprintf(config, "GRAPH_MODE_VGA_640_60:"); break; - case GRAPH_MODE_VGA_640_72: sprintf(config, "GRAPH_MODE_VGA_640_72:"); break; - case GRAPH_MODE_VGA_640_75: sprintf(config, "GRAPH_MODE_VGA_640_75:"); break; - case GRAPH_MODE_VGA_640_85: sprintf(config, "GRAPH_MODE_VGA_640_85:"); break; - case GRAPH_MODE_VGA_800_56: sprintf(config, "GRAPH_MODE_VGA_800_56:"); break; - case GRAPH_MODE_VGA_800_60: sprintf(config, "GRAPH_MODE_VGA_800_60:"); break; - case GRAPH_MODE_VGA_800_72: sprintf(config, "GRAPH_MODE_VGA_800_72:"); break; - case GRAPH_MODE_VGA_800_75: sprintf(config, "GRAPH_MODE_VGA_800_75:"); break; - case GRAPH_MODE_VGA_800_85: sprintf(config, "GRAPH_MODE_VGA_800_85:"); break; - case GRAPH_MODE_VGA_1024_60: sprintf(config, "GRAPH_MODE_VGA_1024_60:"); break; - case GRAPH_MODE_VGA_1024_70: sprintf(config, "GRAPH_MODE_VGA_1024_70:"); break; - case GRAPH_MODE_VGA_1024_75: sprintf(config, "GRAPH_MODE_VGA_1024_75:"); break; - case GRAPH_MODE_VGA_1024_85: sprintf(config, "GRAPH_MODE_VGA_1024_85:"); break; - case GRAPH_MODE_VGA_1280_60: sprintf(config, "GRAPH_MODE_VGA_1280_60:"); break; - case GRAPH_MODE_VGA_1280_75: sprintf(config, "GRAPH_MODE_VGA_1280_75:"); break; - default: sprintf(config, "GRAPH_MODE_AUTO:"); break; + case GRAPH_MODE_NTSC: strcpy(config, "GRAPH_MODE_NTSC:"); break; + case GRAPH_MODE_PAL: strcpy(config, "GRAPH_MODE_PAL:"); break; + case GRAPH_MODE_HDTV_480P: strcpy(config, "GRAPH_MODE_HDTV_480P:"); break; + case GRAPH_MODE_HDTV_576P: strcpy(config, "GRAPH_MODE_HDTV_576P:"); break; + case GRAPH_MODE_HDTV_720P: strcpy(config, "GRAPH_MODE_HDTV_720P:"); break; + case GRAPH_MODE_HDTV_1080I: strcpy(config, "GRAPH_MODE_HDTV_1080I:"); break; + case GRAPH_MODE_VGA_640_60: strcpy(config, "GRAPH_MODE_VGA_640_60:"); break; + case GRAPH_MODE_VGA_640_72: strcpy(config, "GRAPH_MODE_VGA_640_72:"); break; + case GRAPH_MODE_VGA_640_75: strcpy(config, "GRAPH_MODE_VGA_640_75:"); break; + case GRAPH_MODE_VGA_640_85: strcpy(config, "GRAPH_MODE_VGA_640_85:"); break; + case GRAPH_MODE_VGA_800_56: strcpy(config, "GRAPH_MODE_VGA_800_56:"); break; + case GRAPH_MODE_VGA_800_60: strcpy(config, "GRAPH_MODE_VGA_800_60:"); break; + case GRAPH_MODE_VGA_800_72: strcpy(config, "GRAPH_MODE_VGA_800_72:"); break; + case GRAPH_MODE_VGA_800_75: strcpy(config, "GRAPH_MODE_VGA_800_75:"); break; + case GRAPH_MODE_VGA_800_85: strcpy(config, "GRAPH_MODE_VGA_800_85:"); break; + case GRAPH_MODE_VGA_1024_60: strcpy(config, "GRAPH_MODE_VGA_1024_60:"); break; + case GRAPH_MODE_VGA_1024_70: strcpy(config, "GRAPH_MODE_VGA_1024_70:"); break; + case GRAPH_MODE_VGA_1024_75: strcpy(config, "GRAPH_MODE_VGA_1024_75:"); break; + case GRAPH_MODE_VGA_1024_85: strcpy(config, "GRAPH_MODE_VGA_1024_85:"); break; + case GRAPH_MODE_VGA_1280_60: strcpy(config, "GRAPH_MODE_VGA_1280_60:"); break; + case GRAPH_MODE_VGA_1280_75: strcpy(config, "GRAPH_MODE_VGA_1280_75:"); break; + default: strcpy(config, "GRAPH_MODE_AUTO:"); break; } @@ -41,9 +41,9 @@ int graph_make_config(int mode, int interlace, int ffmd, int x, int y, int flick switch (interlace) { - case GRAPH_MODE_NONINTERLACED: sprintf(config, "GRAPH_MODE_NONINTERLACED:"); break; + case GRAPH_MODE_NONINTERLACED: strcpy(config, "GRAPH_MODE_NONINTERLACED:"); break; case GRAPH_MODE_INTERLACED: //Fall through - default: sprintf(config, "GRAPH_MODE_INTERLACED:"); break; + default: strcpy(config, "GRAPH_MODE_INTERLACED:"); break; } @@ -51,9 +51,9 @@ int graph_make_config(int mode, int interlace, int ffmd, int x, int y, int flick switch (ffmd) { - case GRAPH_MODE_FRAME: sprintf(config, "GRAPH_MODE_FRAME:"); break; + case GRAPH_MODE_FRAME: strcpy(config, "GRAPH_MODE_FRAME:"); break; case GRAPH_MODE_FIELD: //Fall through - default: sprintf(config, "GRAPH_MODE_FIELD:"); break; + default: strcpy(config, "GRAPH_MODE_FIELD:"); break; } @@ -61,9 +61,9 @@ int graph_make_config(int mode, int interlace, int ffmd, int x, int y, int flick switch (flicker_filter) { - case GRAPH_ENABLE: sprintf(config, "GRAPH_ENABLE:"); break; + case GRAPH_ENABLE: strcpy(config, "GRAPH_ENABLE:"); break; case GRAPH_DISABLE: //Fall through - default: sprintf(config, "GRAPH_DISABLE:"); break; + default: strcpy(config, "GRAPH_DISABLE:"); break; } diff --git a/ee/kernel/src/iopcontrol.c b/ee/kernel/src/iopcontrol.c index 5d2554d64200..bec4a0fe835a 100644 --- a/ee/kernel/src/iopcontrol.c +++ b/ee/kernel/src/iopcontrol.c @@ -88,8 +88,7 @@ int SifIopReboot(const char *arg) sceSifInitRpc(0); sceSifExitRpc(); - strcpy(param_str, "rom0:UDNL "); - strcat(param_str, arg); + snprintf(param_str, sizeof(param_str), "rom0:UDNL %s", arg); return SifIopReset(param_str, 0); } diff --git a/ee/libcglue/src/timezone.c b/ee/libcglue/src/timezone.c index 9cce3934ddc6..7e0c11b928a3 100644 --- a/ee/libcglue/src/timezone.c +++ b/ee/libcglue/src/timezone.c @@ -36,10 +36,10 @@ void _libcglue_timezone_update_impl() int hours = tzOffsetAbs / 60; int minutes = tzOffsetAbs - hours * 60; int daylight = configIsDaylightSavingEnabledWithIODriver(&driver); - static char tz[15]; + static char tz[28]; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wformat-overflow" - sprintf(tz, "GMT%s%02i:%02i%s", tzOffset < 0 ? "+" : "-", hours, minutes, daylight ? "DST" : ""); + snprintf(tz, sizeof(tz), "GMT%s%02i:%02i%s", tzOffset < 0 ? "+" : "-", hours, minutes, daylight ? "DST" : ""); #pragma GCC diagnostic pop setenv("TZ", tz, 1); } diff --git a/ee/rpc/hdd/src/libhdd.c b/ee/rpc/hdd/src/libhdd.c index f947f0c006ba..d848bebd9464 100644 --- a/ee/rpc/hdd/src/libhdd.c +++ b/ee/rpc/hdd/src/libhdd.c @@ -164,7 +164,7 @@ int hddGetFilesystemList(t_hddFilesystem hddFs[], int maxEntries) } memset(&hddFs[count], 0, sizeof(t_hddFilesystem)); - snprintf(hddFs[count].filename, 40, "hdd0:%.34s", dirEnt.name); + snprintf(hddFs[count].filename, sizeof(hddFs[count].filename), "hdd0:%.34s", dirEnt.name); // Work out filesystem type if((dirEnt.name[0] == '_') && (dirEnt.name[1] == '_')) @@ -299,7 +299,7 @@ int hddMakeFilesystem(int fsSizeMB, char *name, int type) int partSize; int fsSizeLeft = fsSizeMB; int partFd; - char openString[256]; + char openString[268]; char fsName[256]; int retVal; @@ -312,18 +312,18 @@ int hddMakeFilesystem(int fsSizeMB, char *name, int type) switch(type) { case FS_GROUP_SYSTEM: - sprintf(fsName, "__%s", name); + snprintf(fsName, sizeof(fsName), "__%s", name); break; case FS_GROUP_COMMON: - sprintf(fsName, "+%s", name); + snprintf(fsName, sizeof(fsName), "+%s", name); break; default: - strcpy(fsName, name); + snprintf(fsName, sizeof(fsName), "%s", name); break; } // Check if filesystem already exists - sprintf(openString, "hdd0:%s", fsName); + snprintf(openString, sizeof(openString), "hdd0:%s", fsName); partFd = fileXioOpen(openString, FIO_O_RDONLY); if(partFd > 0 || partFd == -EACCES) // Filesystem already exists { @@ -345,7 +345,7 @@ int hddMakeFilesystem(int fsSizeMB, char *name, int type) printf(">>> Attempting to create main partition, size %d MB\n", partSize); #endif - sprintf(openString, "hdd0:%s,,,%s,PFS", fsName, sizesString[useIndex]); + snprintf(openString, sizeof(openString), "hdd0:%s,,,%s,PFS", fsName, sizesString[useIndex]); #ifdef DEBUG printf(">>> openString = %s\n", openString); #endif @@ -441,7 +441,7 @@ int hddMakeFilesystem(int fsSizeMB, char *name, int type) fileXioClose(partFd); - sprintf(openString, "hdd0:%s", fsName); + snprintf(openString, sizeof(openString), "hdd0:%s", fsName); retVal = fileXioFormat("pfs:", openString, (const char*)&pfsFormatArg, sizeof(pfsFormatArg)); if(retVal < 0) { diff --git a/tools/romimg/src/main.c b/tools/romimg/src/main.c index ef724899d6ad..1d6bc0c37d46 100644 --- a/tools/romimg/src/main.c +++ b/tools/romimg/src/main.c @@ -143,8 +143,8 @@ int main(int argc, char **argv) } else if ((argc == 3 || argc == 4) && strcmp(argv[1], "-x") == 0) { if ((result = LoadROMImg(&ROMImg, argv[2])) == 0) { if (argc == 3) { - char FOLDER[256] = "ext_"; - strcat(FOLDER, argv[2]); + char FOLDER[256]; + snprintf(FOLDER, sizeof(FOLDER), "ext_%s", argv[2]); #if defined(_WIN32) || defined(WIN32) mkdir(FOLDER); #else diff --git a/tools/srxfixup/src/elfdump.c b/tools/srxfixup/src/elfdump.c index 981647c21634..87606484b6c3 100644 --- a/tools/srxfixup/src/elfdump.c +++ b/tools/srxfixup/src/elfdump.c @@ -452,21 +452,13 @@ void print_elf_disasm(const elf_file *elf, const elf_section *scp, unsigned int pb[k] = 32; } pb[48] = 0; - sprintf(&pb[strlen(pb)], "%3d:", rel[i].rid); - if ( rel[i].rp ) - { - rp = rel[i].rp; - strcat(pb, " "); - } - else - { - rp = rel[i].mhrp; - strcat(pb, ">"); - } + snprintf(&pb[strlen(pb)], sizeof(pb) - strlen(pb), "%3d:%c", rel[i].rid, rel[i].rp ? ' ' : '>'); + rp = rel[i].rp ? rel[i].rp : rel[i].mhrp; if ( rp->symptr && rp->symptr->type == STT_SECTION ) { - sprintf( + snprintf( &pb[strlen(pb)], + sizeof(pb) - strlen(pb), " %s %d '%s'", num2name(R_MIPS_Type, rp->type), (int)(rp->rel.r_info >> 8), @@ -492,8 +484,9 @@ void print_elf_disasm(const elf_file *elf, const elf_section *scp, unsigned int break; } } - sprintf( + snprintf( &pb[strlen(pb)], + sizeof(pb) - strlen(pb), "%c %s %d %s", v7, num2name(R_MIPS_Type, rp->type), @@ -923,7 +916,7 @@ static const char *num2name(const struct name2num *table, unsigned int num) return table->name; } } - sprintf(buf_28, "? 0x%x", num); + snprintf(buf_28, sizeof(buf_28), "? 0x%x", num); return buf_28; } diff --git a/tools/srxfixup/src/elflib.c b/tools/srxfixup/src/elflib.c index f2ece308a915..502d121ea46d 100644 --- a/tools/srxfixup/src/elflib.c +++ b/tools/srxfixup/src/elflib.c @@ -1612,14 +1612,14 @@ void dump_file_order_list(const elf_file *elf, const Elf_file_slot *efs) name = "[Proram Header Table]"; break; case EFS_TYPE_PROGRAM_HEADER_ENTRY: - sprintf(tmp, "[Proram Header entry %d]", (int)(0xCCCCCCCD * ((char *)slot->d.php - (char *)elf->php)) >> 3); + snprintf(tmp, sizeof(tmp), "[Proram Header entry %d]", (int)(0xCCCCCCCD * ((char *)slot->d.php - (char *)elf->php)) >> 3); name = tmp; break; case EFS_TYPE_SECTION_HEADER_TABLE: name = "[Section Header Table]"; break; case EFS_TYPE_SECTION_DATA: - sprintf(tmp, "%s data", slot->d.scp->name); + snprintf(tmp, sizeof(tmp), "%s data", slot->d.scp->name); name = tmp; break; default: @@ -1653,7 +1653,7 @@ void dump_file_order_list(const elf_file *elf, const Elf_file_slot *efs) } startpos_2 = scp[i]->shr.sh_offset; size_2 = (oldend_2 == 0) ? (scp[i]->shr.sh_offset) : (Elf32_Off)(oldend_2 + startpos_2 - 1); - sprintf(tmp, "(%s)", scp[i]->name); + snprintf(tmp, sizeof(tmp), "(%s)", scp[i]->name); name = tmp; if ( startpos_2 > size_tmp + 1 ) { diff --git a/tools/srxfixup/src/readconf.c b/tools/srxfixup/src/readconf.c index 420fbfc80eef..fb0e25033ed1 100644 --- a/tools/srxfixup/src/readconf.c +++ b/tools/srxfixup/src/readconf.c @@ -687,6 +687,7 @@ static Srx_gen_table *make_srx_gen_table(TokenTree *tokentree) int nsect; const char **strp; const char *str; + int str2_len; char *str2; result = (Srx_gen_table *)calloc(1, sizeof(Srx_gen_table)); @@ -863,8 +864,9 @@ static Srx_gen_table *make_srx_gen_table(TokenTree *tokentree) free(result); return 0; } - str2 = (char *)malloc(0x32); - sprintf(str2, "@Program_header_data %s", ttp1->value.lowtoken->str); + str2_len = 0x32; + str2 = (char *)malloc(str2_len); + snprintf(str2, str2_len, "@Program_header_data %s", ttp1->value.lowtoken->str); result->file_layout_order = add_stringvector(result->file_layout_order, str2); ttp = nttp; break; diff --git a/tools/srxfixup/src/srxgen.c b/tools/srxfixup/src/srxgen.c index 5a2b79cf87e7..8bb6fa04740a 100644 --- a/tools/srxfixup/src/srxgen.c +++ b/tools/srxfixup/src/srxgen.c @@ -742,6 +742,7 @@ const char *eos_str = "_end_of_section_"; static void define_special_section_symbols(elf_file *elf) { char *sectname; + int sectname_len; const elf_syment *sym; elf_syment **syp; elf_section *scp; @@ -755,7 +756,8 @@ static void define_special_section_symbols(elf_file *elf) { return; } - sectname = (char *)__builtin_alloca(((elf->shstrptr->shr.sh_size + 22) >> 2) << 2); + sectname_len = ((elf->shstrptr->shr.sh_size + 22) >> 2) << 2; + sectname = (char *)__builtin_alloca(sectname_len); entrise = scp->shr.sh_size / scp->shr.sh_entsize; syp = (elf_syment **)(scp->data); for ( i = 1; i < entrise; i += 1 ) @@ -765,14 +767,12 @@ static void define_special_section_symbols(elf_file *elf) { if ( !strncmp(bos_str, sym->name, strlen(bos_str)) ) { - strcpy(sectname, "."); - strcat(sectname, &sym->name[strlen(bos_str)]); + snprintf(sectname, sectname_len, ".%s", &sym->name[strlen(bos_str)]); add_reserved_symbol_table(tp, sym->name, 2, 1, 0, sectname, 0, 0); } if ( !strncmp(eos_str, sym->name, strlen(eos_str)) ) { - strcpy(sectname, "."); - strcat(sectname, &sym->name[strlen(eos_str)]); + snprintf(sectname, sectname_len, ".%s", &sym->name[strlen(eos_str)]); add_reserved_symbol_table(tp, sym->name, 2, 1, 0, sectname, 65311, 1); } }