Ignore dangling symlinks in getDirectoryContents()

Thanks to Markus Oberhumer for the patch!


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21370 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Misha Brukman 2005-04-20 04:04:07 +00:00
parent 4b2afe6394
commit 4619c75f64

View File

@ -398,17 +398,22 @@ Path::getDirectoryContents(std::set<Path>& result) const {
result.clear();
struct dirent* de = ::readdir(direntries);
while (de != 0) {
for ( ; de != 0; de = ::readdir(direntries)) {
if (de->d_name[0] != '.') {
Path aPath(path + (const char*)de->d_name);
struct stat buf;
if (0 != stat(aPath.path.c_str(), &buf))
if (0 != stat(aPath.path.c_str(), &buf)) {
int saved_errno = errno;
struct stat st;
if (0 == lstat(aPath.path.c_str(), &st) && S_ISLNK(st.st_mode))
continue; // dangling symlink -- ignore
errno = saved_errno;
ThrowErrno(aPath.path + ": can't get status");
}
if (S_ISDIR(buf.st_mode))
aPath.path += "/";
result.insert(aPath);
}
de = ::readdir(direntries);
}
closedir(direntries);