From 6d86744a734a1606daa76a87a91aad3903e858a9 Mon Sep 17 00:00:00 2001 From: Catania Date: Fri, 16 Jan 2026 03:00:34 +0100 Subject: [PATCH] Added security check in case of memory leak --- src/rcore.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/rcore.c b/src/rcore.c index fd29077b8..fc8a99e8f 100644 --- a/src/rcore.c +++ b/src/rcore.c @@ -508,8 +508,8 @@ static void SetupViewport(int width, int height); // Set viewport for static unsigned int GetDirectoryFileCount(const char *dirPath); // Get the file count in a directory static unsigned int GetDirectoryFileCountEx(const char *basePath, const char *filter, bool scanSubdirs);// Get the file count in a directory with extension filtering and recursive directory scan. Use 'DIR' in the filter string to include directories in the result -static void ScanDirectoryFiles(const char *basePath, FilePathList *list, const char *filter, unsigned int maxFileCount); // Scan all files and directories in a base path -static void ScanDirectoryFilesRecursively(const char *basePath, FilePathList *list, const char *filter, unsigned int maxFileCount); // Scan all files and directories recursively from a base path +static void ScanDirectoryFiles(const char *basePath, FilePathList *list, const char *filter, unsigned int fileCount); // Scan all files and directories in a base path +static void ScanDirectoryFilesRecursively(const char *basePath, FilePathList *list, const char *filter, unsigned int fileCount); // Scan all files and directories recursively from a base path #if defined(SUPPORT_AUTOMATION_EVENTS) static void RecordAutomationEvent(void); // Record frame events (to internal events array) @@ -4310,7 +4310,7 @@ static unsigned int GetDirectoryFileCountEx(const char *basePath, const char *fi // Scan all files and directories in a base path // WARNING: files.paths[] must be previously allocated and // contain enough space to store all required paths -static void ScanDirectoryFiles(const char *basePath, FilePathList *files, const char *filter, unsigned int maxFileCount) +static void ScanDirectoryFiles(const char *basePath, FilePathList *files, const char *filter, unsigned int fileCount) { static char path[MAX_FILEPATH_LENGTH] = { 0 }; memset(path, 0, MAX_FILEPATH_LENGTH); @@ -4320,7 +4320,7 @@ static void ScanDirectoryFiles(const char *basePath, FilePathList *files, const if (dir != NULL) { - while ((dp = readdir(dir)) != NULL && files->count < maxFileCount) + while (((dp = readdir(dir)) != NULL) && (files->count < fileCount)) { if ((strcmp(dp->d_name, ".") != 0) && (strcmp(dp->d_name, "..") != 0)) @@ -4366,12 +4366,19 @@ static void ScanDirectoryFiles(const char *basePath, FilePathList *files, const closedir(dir); } else TRACELOG(LOG_WARNING, "FILEIO: Directory cannot be opened (%s)", basePath); + + // Security check: read files.count should match fileCounter + if (files->count != fileCount) + { + TRACELOG(LOG_WARNING, "FILEIO: Read files count do not match capacity allocated"); + files->count = fileCount; // Avoid memory leak when unloading this FilePathList + } } // Scan all files and directories recursively from a base path // WARNING: files.paths[] must be previously allocated and // contain enough space to store all required paths -static void ScanDirectoryFilesRecursively(const char *basePath, FilePathList *files, const char *filter, unsigned int maxFileCount) +static void ScanDirectoryFilesRecursively(const char *basePath, FilePathList *files, const char *filter, unsigned int fileCount) { // WARNING: Path can not be static or it will be reused between recursive function calls! char path[MAX_FILEPATH_LENGTH] = { 0 }; @@ -4382,7 +4389,7 @@ static void ScanDirectoryFilesRecursively(const char *basePath, FilePathList *fi if (dir != NULL) { - while (((dp = readdir(dir)) != NULL) && files->count < maxFileCount) + while (((dp = readdir(dir)) != NULL) && (files->count < fileCount)) { if ((strcmp(dp->d_name, ".") != 0) && (strcmp(dp->d_name, "..") != 0)) { @@ -4421,7 +4428,7 @@ static void ScanDirectoryFilesRecursively(const char *basePath, FilePathList *fi files->count++; } - ScanDirectoryFilesRecursively(path, files, filter, maxFileCount); + ScanDirectoryFilesRecursively(path, files, filter, fileCount); } } } @@ -4429,6 +4436,13 @@ static void ScanDirectoryFilesRecursively(const char *basePath, FilePathList *fi closedir(dir); } else TRACELOG(LOG_WARNING, "FILEIO: Directory cannot be opened (%s)", basePath); + + // Security check: read files.count should match fileCounter + if (files->count != fileCount) + { + TRACELOG(LOG_WARNING, "FILEIO: Read files count do not match capacity allocated"); + files->count = fileCount; // Avoid memory leak when unloading this FilePathList + } } #if defined(SUPPORT_AUTOMATION_EVENTS)