2 Commits

Author SHA1 Message Date
Ray
2dd8d7e8b1 Update rcore_desktop_sdl.c 2026-04-29 01:08:16 +02:00
168e2c43d0 fix(rcore): correct string boundary handling (#5812)
Co-authored-by: Huang Zhaobin <xcpky@proton.me>
2026-04-29 00:18:33 +02:00
2 changed files with 19 additions and 16 deletions

View File

@ -1144,7 +1144,7 @@ const char *GetClipboardText(void)
char *clipboard = SDL_GetClipboardText(); char *clipboard = SDL_GetClipboardText();
int clipboardSize = snprintf(buffer, sizeof(buffer), "%s", clipboard); int clipboardSize = snprintf(buffer, MAX_CLIPBOARD_BUFFER_LENGTH, "%s", clipboard);
if (clipboardSize >= MAX_CLIPBOARD_BUFFER_LENGTH) if (clipboardSize >= MAX_CLIPBOARD_BUFFER_LENGTH)
{ {
char *truncate = buffer + MAX_CLIPBOARD_BUFFER_LENGTH - 4; char *truncate = buffer + MAX_CLIPBOARD_BUFFER_LENGTH - 4;

View File

@ -2004,7 +2004,7 @@ unsigned char *LoadFileData(const char *fileName, int *dataSize)
{ {
*dataSize = (int)count; *dataSize = (int)count;
if ((*dataSize) != size) TRACELOG(LOG_WARNING, "FILEIO: [%s] File partially loaded (%i bytes out of %i)", fileName, dataSize, count); if ((*dataSize) != size) TRACELOG(LOG_WARNING, "FILEIO: [%s] File partially loaded (%i bytes out of %i)", fileName, *dataSize, size);
else TRACELOG(LOG_INFO, "FILEIO: [%s] File loaded successfully", fileName); else TRACELOG(LOG_INFO, "FILEIO: [%s] File loaded successfully", fileName);
} }
} }
@ -2365,8 +2365,7 @@ bool IsFileExtension(const char *fileName, const char *ext)
{ {
int fileExtLength = (int)strlen(fileExt); int fileExtLength = (int)strlen(fileExt);
char fileExtLower[16] = { 0 }; char fileExtLower[16] = { 0 };
char *fileExtLowerPtr = fileExtLower; for (int i = 0; (i < fileExtLength) && (i < 15); i++)
for (int i = 0; (i < fileExtLength) && (i < 16); i++)
{ {
// Copy and convert to lower-case // Copy and convert to lower-case
if ((fileExt[i] >= 'A') && (fileExt[i] <= 'Z')) fileExtLower[i] = fileExt[i] + 32; if ((fileExt[i] >= 'A') && (fileExt[i] <= 'Z')) fileExtLower[i] = fileExt[i] + 32;
@ -2377,7 +2376,7 @@ bool IsFileExtension(const char *fileName, const char *ext)
int extLength = (int)strlen(ext); int extLength = (int)strlen(ext);
char *extList = (char *)RL_CALLOC(extLength + 1, 1); char *extList = (char *)RL_CALLOC(extLength + 1, 1);
char *extListPtrs[MAX_FILE_EXTENSIONS] = { 0 }; char *extListPtrs[MAX_FILE_EXTENSIONS] = { 0 };
strncpy(extList, ext, extLength); memcpy(extList, ext, extLength);
extListPtrs[0] = extList; extListPtrs[0] = extList;
for (int i = 0; i < extLength; i++) for (int i = 0; i < extLength; i++)
@ -2386,19 +2385,23 @@ bool IsFileExtension(const char *fileName, const char *ext)
if ((extList[i] >= 'A') && (extList[i] <= 'Z')) extList[i] += 32; if ((extList[i] >= 'A') && (extList[i] <= 'Z')) extList[i] += 32;
// Get pointer to next extension and add null-terminator // Get pointer to next extension and add null-terminator
if ((extList[i] == ';') && (extCount < (MAX_FILE_EXTENSIONS - 1))) if (extList[i] == ';')
{ {
extList[i] = '\0'; extList[i] = '\0';
if (extCount < MAX_FILE_EXTENSIONS)
{
extListPtrs[extCount] = extList + i + 1; extListPtrs[extCount] = extList + i + 1;
extCount++; extCount++;
} }
} }
}
for (int i = 0; i < extCount; i++) for (int i = 0; i < extCount; i++)
{ {
// Consider the case where extension provided // Consider the case where extension provided
// does not start with the '.' // does not start with the '.'
fileExtLowerPtr = fileExtLower; char *fileExtLowerPtr = fileExtLower;
if (extListPtrs[i][0] != '.') fileExtLowerPtr++; if (extListPtrs[i][0] != '.') fileExtLowerPtr++;
if (strcmp(fileExtLowerPtr, extListPtrs[i]) == 0) if (strcmp(fileExtLowerPtr, extListPtrs[i]) == 0)
@ -2611,7 +2614,7 @@ const char *GetWorkingDirectory(void)
static char currentDir[MAX_FILEPATH_LENGTH] = { 0 }; static char currentDir[MAX_FILEPATH_LENGTH] = { 0 };
memset(currentDir, 0, MAX_FILEPATH_LENGTH); memset(currentDir, 0, MAX_FILEPATH_LENGTH);
char *path = GETCWD(currentDir, MAX_FILEPATH_LENGTH - 1); char *path = GETCWD(currentDir, MAX_FILEPATH_LENGTH);
return path; return path;
} }
@ -2958,9 +2961,9 @@ unsigned int GetDirectoryFileCountEx(const char *basePath, const char *filter, b
{ {
// Construct new path from our base path // Construct new path from our base path
#if defined(_WIN32) #if defined(_WIN32)
int pathLength = snprintf(path, MAX_FILEPATH_LENGTH - 1, "%s\\%s", basePath, entity->d_name); int pathLength = snprintf(path, MAX_FILEPATH_LENGTH, "%s\\%s", basePath, entity->d_name);
#else #else
int pathLength = snprintf(path, MAX_FILEPATH_LENGTH - 1, "%s/%s", basePath, entity->d_name); int pathLength = snprintf(path, MAX_FILEPATH_LENGTH, "%s/%s", basePath, entity->d_name);
#endif #endif
// Don't add to count if path too long // Don't add to count if path too long
if ((pathLength < 0) || (pathLength >= MAX_FILEPATH_LENGTH)) if ((pathLength < 0) || (pathLength >= MAX_FILEPATH_LENGTH))
@ -4286,9 +4289,9 @@ static void ScanDirectoryFiles(const char *basePath, FilePathList *files, const
{ {
// Construct new path from our base path // Construct new path from our base path
#if defined(_WIN32) #if defined(_WIN32)
int pathLength = snprintf(path, MAX_FILEPATH_LENGTH - 1, "%s\\%s", basePath, dp->d_name); int pathLength = snprintf(path, MAX_FILEPATH_LENGTH, "%s\\%s", basePath, dp->d_name);
#else #else
int pathLength = snprintf(path, MAX_FILEPATH_LENGTH - 1, "%s/%s", basePath, dp->d_name); int pathLength = snprintf(path, MAX_FILEPATH_LENGTH, "%s/%s", basePath, dp->d_name);
#endif #endif
if ((pathLength < 0) || (pathLength >= MAX_FILEPATH_LENGTH)) if ((pathLength < 0) || (pathLength >= MAX_FILEPATH_LENGTH))
@ -4300,7 +4303,7 @@ static void ScanDirectoryFiles(const char *basePath, FilePathList *files, const
if ((filter == NULL) || (strstr(filter, FILE_FILTER_TAG_ALL) != NULL) || if ((filter == NULL) || (strstr(filter, FILE_FILTER_TAG_ALL) != NULL) ||
(strstr(filter, FILE_FILTER_TAG_FILE_ONLY) != NULL) || IsFileExtension(path, filter)) (strstr(filter, FILE_FILTER_TAG_FILE_ONLY) != NULL) || IsFileExtension(path, filter))
{ {
strncpy(files->paths[files->count], path, MAX_FILEPATH_LENGTH - 1); memcpy(files->paths[files->count], path, pathLength);
files->count++; files->count++;
} }
} }
@ -4308,7 +4311,7 @@ static void ScanDirectoryFiles(const char *basePath, FilePathList *files, const
{ {
if ((filter != NULL) && ((strstr(filter, FILE_FILTER_TAG_DIR_ONLY) != NULL) || (strstr(filter, FILE_FILTER_TAG_ALL) != NULL))) if ((filter != NULL) && ((strstr(filter, FILE_FILTER_TAG_DIR_ONLY) != NULL) || (strstr(filter, FILE_FILTER_TAG_ALL) != NULL)))
{ {
strncpy(files->paths[files->count], path, MAX_FILEPATH_LENGTH - 1); memcpy(files->paths[files->count], path, pathLength);
files->count++; files->count++;
} }