mirror of
https://github.com/intel/llvm.git
synced 2026-01-22 23:49:22 +08:00
Change EnumerateDirectory from using readdir() to using readdir_r()
so it can be re-entered while iterating over a directory safely. llvm-svn: 178738
This commit is contained in:
@@ -891,8 +891,15 @@ FileSpec::EnumerateDirectory
|
||||
lldb_utility::CleanUp <DIR *, int> dir_path_dir (opendir(dir_path), NULL, closedir);
|
||||
if (dir_path_dir.is_valid())
|
||||
{
|
||||
struct dirent* dp;
|
||||
while ((dp = readdir(dir_path_dir.get())) != NULL)
|
||||
long path_max = fpathconf (dirfd (dir_path_dir.get()), _PC_NAME_MAX);
|
||||
#if defined (__APPLE_) && defined (__DARWIN_MAXPATHLEN)
|
||||
if (path_max < __DARWIN_MAXPATHLEN)
|
||||
path_max = __DARWIN_MAXPATHLEN;
|
||||
#endif
|
||||
struct dirent *buf, *dp;
|
||||
buf = (struct dirent *) malloc (offsetof (struct dirent, d_name) + path_max + 1);
|
||||
|
||||
while (buf && readdir_r(dir_path_dir.get(), buf, &dp) == 0 && dp)
|
||||
{
|
||||
// Only search directories
|
||||
if (dp->d_type == DT_DIR || dp->d_type == DT_UNKNOWN)
|
||||
@@ -969,6 +976,10 @@ FileSpec::EnumerateDirectory
|
||||
}
|
||||
}
|
||||
}
|
||||
if (buf)
|
||||
{
|
||||
free (buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
// By default when exiting a directory, we tell the parent enumeration
|
||||
|
||||
Reference in New Issue
Block a user