Fix a problem in getDirectoryContents where sub-directory names were
authorReid Spencer <rspencer@reidspencer.com>
Thu, 28 Jul 2005 16:25:57 +0000 (16:25 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Thu, 28 Jul 2005 16:25:57 +0000 (16:25 +0000)
appended to a path string that didn't end in a slash, yielding invalid
path names.

Path contribute by Nicholas Riley.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22539 91177308-0d34-0410-b5e6-96231b3b80d8

lib/System/Unix/Path.inc

index 9d5e7fa9100f4503e0a626d43b12fb64204e8dd6..2da76e8ad133427fe27d8a9c7945b6c4e537a5c4 100644 (file)
 # undef HAVE_MKDTEMP
 #endif
 
+namespace {
+inline bool lastIsSlash(const std::string& path) {
+  return !path.empty() && path[path.length() - 1] == '/';
+}
+
+}
+
 namespace llvm {
 using namespace sys;
 
@@ -437,11 +444,15 @@ Path::getDirectoryContents(std::set<Path>& result) const {
   if (direntries == 0)
     ThrowErrno(path + ": can't open directory");
 
+  std::string dirPath = path;
+  if (!lastIsSlash(dirPath))
+    dirPath += '/';
+
   result.clear();
   struct dirent* de = ::readdir(direntries);
   for ( ; de != 0; de = ::readdir(direntries)) {
     if (de->d_name[0] != '.') {
-      Path aPath(path + (const char*)de->d_name);
+      Path aPath(dirPath + (const char*)de->d_name);
       struct stat buf;
       if (0 != stat(aPath.path.c_str(), &buf)) {
         int stat_errno = errno;
@@ -477,11 +488,8 @@ Path::appendComponent(const std::string& name) {
   if (name.empty())
     return false;
   std::string save(path);
-  if (!path.empty()) {
-    size_t last = path.size() - 1;
-    if (path[last] != '/') 
-      path += '/';
-  }
+  if (!lastIsSlash(path))
+    path += '/';
   path += name;
   if (!isValid()) {
     path = save;