Fix and improve win32 path validation.
authorJeff Cohen <jeffc@jolt-lang.org>
Fri, 14 Jan 2005 04:09:39 +0000 (04:09 +0000)
committerJeff Cohen <jeffc@jolt-lang.org>
Fri, 14 Jan 2005 04:09:39 +0000 (04:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19545 91177308-0d34-0410-b5e6-96231b3b80d8

lib/System/Win32/Path.inc

index a8862380e9eb03e53b7577aceacb87a77c961fc0..7f891f43f9fd590f19664810191451bffb958010 100644 (file)
@@ -55,17 +55,29 @@ Path::isValid() const {
       != std::string::npos)
     return false;
 
-  // A file or directory name may not end in a period.
-  if (path[len-1] == '.')
-    return false;
-  if (len >= 2 && path[len-2] == '.' && path[len-1] == '/')
-    return false;
+  // Check each component for legality.
+  for (pos = 0; pos < len; ++pos) {
+    // A component may not end in a space.
+    if (path[pos] == ' ') {
+      if (path[pos+1] == '/' || path[pos+1] == '\0')
+        return false;
+    }
 
-  // A file or directory name may not end in a space.
-  if (path[len-1] == ' ')
-    return false;
-  if (len >= 2 && path[len-2] == ' ' && path[len-1] == '/')
-    return false;
+    // A component may not end in a period.
+    if (path[pos] == '.') {
+      if (path[pos+1] == '/' || path[pos+1] == '\0') {
+        // Unless it is the pseudo-directory "."...
+        if (pos == 0 || path[pos-1] == '/' || path[pos-1] == ':')
+          return true;
+        // or "..".
+        if (pos > 0 && path[pos-1] == '.') {
+          if (pos == 1 || path[pos-2] == '/' || path[pos-2] == ':')
+            return true;
+        }
+        return false;
+      }
+    }
+  }
 
   return true;
 }