浏览代码

Fix absolute path handling in GetFileName and GetDirectoryPath (#1534) (#1535)

Gil Barbosa Reis 4 年之前
父节点
当前提交
1866be0475
共有 1 个文件被更改,包括 15 次插入6 次删除
  1. 15 6
      src/core.c

+ 15 - 6
src/core.c

@@ -2353,7 +2353,7 @@ const char *GetFileName(const char *filePath)
     const char *fileName = NULL;
     const char *fileName = NULL;
     if (filePath != NULL) fileName = strprbrk(filePath, "\\/");
     if (filePath != NULL) fileName = strprbrk(filePath, "\\/");
 
 
-    if (!fileName || (fileName == filePath)) return filePath;
+    if (!fileName) return filePath;
 
 
     return fileName + 1;
     return fileName + 1;
 }
 }
@@ -2399,9 +2399,9 @@ const char *GetDirectoryPath(const char *filePath)
     static char dirPath[MAX_FILEPATH_LENGTH];
     static char dirPath[MAX_FILEPATH_LENGTH];
     memset(dirPath, 0, MAX_FILEPATH_LENGTH);
     memset(dirPath, 0, MAX_FILEPATH_LENGTH);
 
 
-    // In case provided path does not contains a root drive letter (C:\, D:\),
+    // In case provided path does not contain a root drive letter (C:\, D:\) nor leading path separator (\, /),
     // we add the current directory path to dirPath
     // we add the current directory path to dirPath
-    if (filePath[1] != ':')
+    if (filePath[1] != ':' && filePath[0] != '\\' && filePath[0] != '/')
     {
     {
         // For security, we set starting path to current directory,
         // For security, we set starting path to current directory,
         // obtained path will be concated to this
         // obtained path will be concated to this
@@ -2412,9 +2412,18 @@ const char *GetDirectoryPath(const char *filePath)
     lastSlash = strprbrk(filePath, "\\/");
     lastSlash = strprbrk(filePath, "\\/");
     if (lastSlash)
     if (lastSlash)
     {
     {
-        // NOTE: Be careful, strncpy() is not safe, it does not care about '\0'
-        memcpy(dirPath + ((filePath[1] != ':')? 2 : 0), filePath, strlen(filePath) - (strlen(lastSlash) - 1));
-        dirPath[strlen(filePath) - strlen(lastSlash) + ((filePath[1] != ':')? 2 : 0)] = '\0';  // Add '\0' manually
+        if (lastSlash == filePath)
+        {
+            // The last and only slash is the leading one: path is in a root directory
+            dirPath[0] = filePath[0];
+            dirPath[1] = '\0';
+        }
+        else
+        {
+            // NOTE: Be careful, strncpy() is not safe, it does not care about '\0'
+            memcpy(dirPath + (filePath[1] != ':' && filePath[0] != '\\' && filePath[0] != '/' ? 2 : 0), filePath, strlen(filePath) - (strlen(lastSlash) - 1));
+            dirPath[strlen(filePath) - strlen(lastSlash) + (filePath[1] != ':' && filePath[0] != '\\' && filePath[0] != '/' ? 2 : 0)] = '\0';  // Add '\0' manually
+        }
     }
     }
 
 
     return dirPath;
     return dirPath;