mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-10-07 19:03:57 +00:00
[libc++] Fix double file closing in std::filesystem::remove_all()
.
According to Linux documentation (see e.g. https://linux.die.net/man/3/closedir): > A successful call to `closedir()` also closes the underlying file > descriptor associated with `dirp`. Thus, calling `close()` after a successful call to `closedir()` is at best redundant. Worse, should a different thread open a file in-between the calls to `closedir()` and `close()` and get the same file descriptor, the call to `close()` might actually close a different file than was intended. rdar://89251874 Differential Revision: https://reviews.llvm.org/D120453
This commit is contained in:
parent
3104994104
commit
3906ebf750
@ -1416,12 +1416,14 @@ uintmax_t remove_all_impl(int parent_directory, const path& p, error_code& ec) {
|
|||||||
if (fd != -1) {
|
if (fd != -1) {
|
||||||
// If that worked, iterate over the contents of the directory and
|
// If that worked, iterate over the contents of the directory and
|
||||||
// remove everything in it, recursively.
|
// remove everything in it, recursively.
|
||||||
scope_exit close_fd([=] { ::close(fd); });
|
|
||||||
DIR* stream = ::fdopendir(fd);
|
DIR* stream = ::fdopendir(fd);
|
||||||
if (stream == nullptr) {
|
if (stream == nullptr) {
|
||||||
|
::close(fd);
|
||||||
ec = detail::capture_errno();
|
ec = detail::capture_errno();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
// Note: `::closedir` will also close the associated file descriptor, so
|
||||||
|
// there should be no call to `close(fd)`.
|
||||||
scope_exit close_stream([=] { ::closedir(stream); });
|
scope_exit close_stream([=] { ::closedir(stream); });
|
||||||
|
|
||||||
uintmax_t count = 0;
|
uintmax_t count = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user