From 3be872ed59c631213fc84c29603545e362623c76 Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Thu, 28 Jul 2005 16:25:57 +0000 Subject: [PATCH] Fix a problem in getDirectoryContents where sub-directory names were 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 | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/System/Unix/Path.inc b/lib/System/Unix/Path.inc index 9d5e7fa9100..2da76e8ad13 100644 --- a/lib/System/Unix/Path.inc +++ b/lib/System/Unix/Path.inc @@ -53,6 +53,13 @@ # 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& 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;