Filesystem bug in directory_iterator (operations.cpp, readdir_r_simulator function)

Hi, I have encountered an error in the filesystem library. I am working with Boost 1.34.1, SunOs 5.7, and a multi-threaded environment. This small program reproduces the problem: ------------------------------------------------------ #include <boost/filesystem/fstream.hpp> #include <boost/filesystem/operations.hpp> #include <boost/filesystem/convenience.hpp> #include <boost/foreach.hpp> #include <iostream> int main() { namespace fs = boost::filesystem; fs::path path(".",fs::native); if(fs::exists(path) && fs::is_directory(path)) { fs::directory_iterator begin(path), end; BOOST_FOREACH(fs::path file, std::make_pair(begin,end)) std::cout << file.leaf() << std::endl; } } ------------------------------------------------------ The problem is that this program never ends. Apparently the "begin" iterator never reaches the "end" iterator. It only happens in a multi-thread compilation. But, I think that I know where the bug is. In the file libs/filesystem/src/operations.cpp is were the function 'readdir_r_simulator' is implemented, and, if I understand it correctly, it should return != 0 if an error has ocurred. But, the 1247 line: { return ::readdir_r( dirp, entry, result ); } is wrong, because when an error is encountered, readdir_r() returns a null pointer. NULL is converted to the int 0 and the function returns it. So, I suggest to change that line with: { if(::readdir_r( dirp, entry, result )==NULL) return errno; else return 0; } I will try to post this bug to the bug tracking facility (¿trac?). Regards, Raul.
participants (1)
-
raulh39@ya.com