aboutsummaryrefslogtreecommitdiffstats
path: root/lib/System
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2005-07-28 16:25:57 +0000
committerReid Spencer <rspencer@reidspencer.com>2005-07-28 16:25:57 +0000
commit3be872ed59c631213fc84c29603545e362623c76 (patch)
tree0c952c72b5cfbc34c12de90436881d8b63371347 /lib/System
parenta4433e1b3101ce171dad394149212bc38c0d1e49 (diff)
downloadexternal_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.inc20
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;