From 6a4a446df01b1ef1b2a361f464c1c868cff0247d Mon Sep 17 00:00:00 2001 From: Steveice10 Date: Sun, 26 Aug 2018 00:09:05 -0700 Subject: [PATCH] Correct use of string_copy when building strings. --- source/core/stringutil.c | 6 ++++-- source/fbi/action/installurl.c | 20 ++++++++++---------- source/fbi/task/listtitles.c | 22 ++++++++++++++-------- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/source/core/stringutil.c b/source/core/stringutil.c index c36cce0..e3d273a 100644 --- a/source/core/stringutil.c +++ b/source/core/stringutil.c @@ -22,8 +22,10 @@ bool string_is_empty(const char* str) { } void string_copy(char* dst, const char* src, size_t size) { - strncpy(dst, src, size - 1); - dst[size - 1] = '\0'; + if(size > 0) { + strncpy(dst, src, size - 1); + dst[size - 1] = '\0'; + } } void string_get_file_name(char* out, const char* file, u32 size) { diff --git a/source/fbi/action/installurl.c b/source/fbi/action/installurl.c index 5b23594..91511a6 100644 --- a/source/fbi/action/installurl.c +++ b/source/fbi/action/installurl.c @@ -370,18 +370,18 @@ void action_install_url(const char* confirmMessage, const char* urls, const char u32 len = currEnd - currStart; if((len < 7 || strncmp(currStart, "http://", 7) != 0) && (len < 8 || strncmp(currStart, "https://", 8) != 0)) { - if(len > DOWNLOAD_URL_MAX - 7) { - len = DOWNLOAD_URL_MAX - 7; + if(len > DOWNLOAD_URL_MAX - 8) { + len = DOWNLOAD_URL_MAX - 8; } - strncpy(data->urls[data->installInfo.total], "http://", 8); - strncpy(&data->urls[data->installInfo.total][7], currStart, len); + string_copy(data->urls[data->installInfo.total], "http://", 8); + string_copy(&data->urls[data->installInfo.total][7], currStart, len + 1); } else { - if(len > DOWNLOAD_URL_MAX) { - len = DOWNLOAD_URL_MAX; + if(len > DOWNLOAD_URL_MAX - 1) { + len = DOWNLOAD_URL_MAX - 1; } - strncpy(data->urls[data->installInfo.total], currStart, len); + string_copy(data->urls[data->installInfo.total], currStart, len + 1); } data->installInfo.total++; @@ -400,11 +400,11 @@ void action_install_url(const char* confirmMessage, const char* urls, const char } u32 len = currEnd - currStart; - if(len > FILE_PATH_MAX) { - len = FILE_PATH_MAX; + if(len > FILE_PATH_MAX - 1) { + len = FILE_PATH_MAX - 1; } - strncpy(data->paths[i], currStart, len); + string_copy(data->paths[i], currStart, len + 1); currStart = currEnd + 1; } diff --git a/source/fbi/task/listtitles.c b/source/fbi/task/listtitles.c index aa9e4ac..5f37756 100644 --- a/source/fbi/task/listtitles.c +++ b/source/fbi/task/listtitles.c @@ -92,7 +92,7 @@ static Result task_populate_titles_add_twl(populate_titles_data* data, FS_MediaT Result res = 0; u64 realTitleId = 0; - char productCode[12] = {'\0'}; + char productCode[0x10] = {'\0'}; u16 version = 0; u64 installedSize = 0; @@ -107,7 +107,7 @@ static Result task_populate_titles_add_twl(populate_titles_data* data, FS_MediaT installedSize = entry.size; } else if(R_SUCCEEDED(res = headerRes)) { memcpy(&realTitleId, &header[0x230], sizeof(realTitleId)); - memcpy(productCode, header, sizeof(productCode)); + memcpy(productCode, header, 0xC); version = header[0x01E]; u32 size = 0; @@ -127,7 +127,7 @@ static Result task_populate_titles_add_twl(populate_titles_data* data, FS_MediaT if(titleInfo != NULL) { titleInfo->mediaType = mediaType; titleInfo->titleId = realTitleId; - string_copy(titleInfo->productCode, productCode, 12); + string_copy(titleInfo->productCode, productCode, sizeof(titleInfo->productCode)); titleInfo->version = version; titleInfo->installedSize = installedSize; titleInfo->twl = true; @@ -142,25 +142,31 @@ static Result task_populate_titles_add_twl(populate_titles_data* data, FS_MediaT utf16_to_utf8((uint8_t*) title, bnr_select_title(bnr), sizeof(title) - 1); if(strchr(title, '\n') == NULL) { - size_t len = strlen(title); - string_copy(item->name, title, len); - string_copy(titleInfo->meta.shortDescription, title, len); + string_copy(item->name, title, sizeof(item->name)); + string_copy(titleInfo->meta.shortDescription, title, sizeof(titleInfo->meta.shortDescription)); } else { char* destinations[] = {titleInfo->meta.shortDescription, titleInfo->meta.longDescription, titleInfo->meta.publisher}; + u32 destinationLens[] = {sizeof(titleInfo->meta.shortDescription), sizeof(titleInfo->meta.longDescription), sizeof(titleInfo->meta.publisher)}; int currDest = 0; char* last = title; char* curr = NULL; while(currDest < 3 && (curr = strchr(last, '\n')) != NULL) { - string_copy(destinations[currDest++], last, curr - last); + u32 copyLen = curr - last + 1; + if(copyLen > destinationLens[currDest]) { + copyLen = destinationLens[currDest]; + } + + string_copy(destinations[currDest++], last, copyLen); + last = curr + 1; *curr = ' '; } string_copy(item->name, title, last - title); if(currDest < 3) { - string_copy(destinations[currDest], last, strlen(title) - (last - title)); + string_copy(destinations[currDest], last, destinationLens[currDest]); } }