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
This commit is contained in:
Reid Spencer 2005-07-28 16:25:57 +00:00
parent a4433e1b31
commit 3be872ed59

View File

@ -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;