diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2005-07-28 16:25:57 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2005-07-28 16:25:57 +0000 |
commit | 3be872ed59c631213fc84c29603545e362623c76 (patch) | |
tree | 0c952c72b5cfbc34c12de90436881d8b63371347 /lib/System | |
parent | a4433e1b3101ce171dad394149212bc38c0d1e49 (diff) | |
download | external_llvm-3be872ed59c631213fc84c29603545e362623c76.zip external_llvm-3be872ed59c631213fc84c29603545e362623c76.tar.gz external_llvm-3be872ed59c631213fc84c29603545e362623c76.tar.bz2 |
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
Diffstat (limited to 'lib/System')
-rw-r--r-- | lib/System/Unix/Path.inc | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/lib/System/Unix/Path.inc b/lib/System/Unix/Path.inc index 9d5e7fa..2da76e8 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<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; |