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:
Dag-Erling Smørgrav 2025-08-02 01:11:26 +02:00
parent 01e42ce81f
commit 65bae451c2

View file

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