From aae1572945898c624abb1c07eea01c7f51fe2539 Mon Sep 17 00:00:00 2001 From: Steven Smith Date: Tue, 28 Jun 2016 22:36:14 -0700 Subject: [PATCH] Remove invalid characters from save export/import paths. --- source/core/util.c | 24 ++++++++++++++++++++++++ source/core/util.h | 4 +++- source/ui/section/action/exporttwlsave.c | 5 ++++- source/ui/section/action/importtwlsave.c | 5 ++++- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/source/core/util.c b/source/core/util.c index ac63e94..48bb240 100644 --- a/source/core/util.c +++ b/source/core/util.c @@ -510,4 +510,28 @@ const char* util_get_display_size_units(u64 size) { } return "B"; +} + +void util_escape_file_name(char* out, const char* in, size_t size) { + static const char reservedChars[] = {'<', '>', ':', '"', '/', '\\', '|', '?', '*'}; + + for(u32 i = 0; i < size; i++) { + bool reserved = false; + for(u32 j = 0; j < sizeof(reservedChars); j++) { + if(in[i] == reservedChars[j]) { + reserved = true; + break; + } + } + + if(reserved) { + out[i] = '_'; + } else { + out[i] = in[i]; + } + + if(in[i] == '\0') { + break; + } + } } \ No newline at end of file diff --git a/source/core/util.h b/source/core/util.h index 2746cdc..7ecd59f 100644 --- a/source/core/util.h +++ b/source/core/util.h @@ -72,4 +72,6 @@ Result util_ref_archive(FS_Archive archive); Result util_close_archive(FS_Archive archive); double util_get_display_size(u64 size); -const char* util_get_display_size_units(u64 size); \ No newline at end of file +const char* util_get_display_size_units(u64 size); + +void util_escape_file_name(char* out, const char* in, size_t size); \ No newline at end of file diff --git a/source/ui/section/action/exporttwlsave.c b/source/ui/section/action/exporttwlsave.c index b9b95b3..606f0fb 100644 --- a/source/ui/section/action/exporttwlsave.c +++ b/source/ui/section/action/exporttwlsave.c @@ -65,8 +65,11 @@ static Result action_export_twl_save_open_dst(void* data, u32 index, void* initi FS_Archive sdmcArchive = 0; if(R_SUCCEEDED(res = FSUSER_OpenArchive(&sdmcArchive, ARCHIVE_SDMC, fsMakePath(PATH_EMPTY, "")))) { if(R_SUCCEEDED(res = util_ensure_dir(sdmcArchive, "/fbi/")) && R_SUCCEEDED(res = util_ensure_dir(sdmcArchive, "/fbi/save/"))) { + char gameName[0x10] = {'\0'}; + util_escape_file_name(gameName, exportData->title->productCode, sizeof(gameName)); + char path[FILE_PATH_MAX]; - snprintf(path, sizeof(path), "/fbi/save/%s.sav", exportData->title->productCode); + snprintf(path, sizeof(path), "/fbi/save/%s.sav", gameName); FS_Path* fsPath = util_make_path_utf8(path); if(fsPath != NULL) { diff --git a/source/ui/section/action/importtwlsave.c b/source/ui/section/action/importtwlsave.c index 96ea912..1e5a5fc 100644 --- a/source/ui/section/action/importtwlsave.c +++ b/source/ui/section/action/importtwlsave.c @@ -39,8 +39,11 @@ static Result action_import_twl_save_open_src(void* data, u32 index, u32* handle Result res = 0; + char gameName[0x10] = {'\0'}; + util_escape_file_name(gameName, importData->title->productCode, sizeof(gameName)); + char path[FILE_PATH_MAX]; - snprintf(path, sizeof(path), "/fbi/save/%s.sav", importData->title->productCode); + snprintf(path, sizeof(path), "/fbi/save/%s.sav", gameName); FS_Path* fsPath = util_make_path_utf8(path); if(fsPath != NULL) {