mirror of
https://github.com/opnsense/src.git
synced 2026-06-09 00:32:25 -04:00
kyua: Stop using readdir_r()
It cannot be used safely, and Kyua doesn't even pretend to try. MFC after: 1 week Sponsored by: Klara, Inc. Reviewed by: igoro Differential Revision: https://reviews.freebsd.org/D51680
This commit is contained in:
parent
01e42ce81f
commit
65bae451c2
1 changed files with 6 additions and 12 deletions
|
|
@ -127,16 +127,9 @@ struct utils::fs::detail::directory_iterator::impl : utils::noncopyable {
|
|||
/// not. A null pointer means an invalid iterator.
|
||||
::DIR* _dirp;
|
||||
|
||||
/// Raw representation of the system directory entry.
|
||||
///
|
||||
/// We need to keep this at the class level so that we can use the
|
||||
/// readdir_r(3) function.
|
||||
::dirent _dirent;
|
||||
|
||||
/// Custom representation of the directory entry.
|
||||
///
|
||||
/// This is separate from _dirent because this is the type we return to the
|
||||
/// user. We must keep this as a pointer so that we can support the common
|
||||
/// We must keep this as a pointer so that we can support the common
|
||||
/// operators (* and ->) over iterators.
|
||||
std::unique_ptr< directory_entry > _entry;
|
||||
|
||||
|
|
@ -192,22 +185,23 @@ struct utils::fs::detail::directory_iterator::impl : utils::noncopyable {
|
|||
/// It is possible to use this function on a new directory_entry object to
|
||||
/// initialize the first entry.
|
||||
///
|
||||
/// \throw system_error If the call to readdir_r fails.
|
||||
/// \throw system_error If the call to readdir fails.
|
||||
void
|
||||
next(void)
|
||||
{
|
||||
::dirent* result;
|
||||
|
||||
if (::readdir_r(_dirp, &_dirent, &result) == -1) {
|
||||
errno = 0;
|
||||
if ((result = ::readdir(_dirp)) == NULL && errno != 0) {
|
||||
const int original_errno = errno;
|
||||
throw fs::system_error(F("readdir_r(%s) failed") % _path,
|
||||
throw fs::system_error(F("readdir(%s) failed") % _path,
|
||||
original_errno);
|
||||
}
|
||||
if (result == NULL) {
|
||||
_entry.reset();
|
||||
close();
|
||||
} else {
|
||||
_entry.reset(new directory_entry(_dirent.d_name));
|
||||
_entry.reset(new directory_entry(result->d_name));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue