https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79283
Bug ID: 79283 Summary: read_symlink fails with /proc symlinks Product: gcc Version: 6.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: achille.fouilleul+gcc at gadz dot org Target Milestone: --- Consider the following program: #include <cstdio> #include <exception> #include <experimental/filesystem> //#include <boost/filesystem.hpp> namespace fs = std::experimental::filesystem; //namespace fs = boost::filesystem; int main() { try { fs::path symlinkPath("/proc/self"); auto targetPath = fs::read_symlink(symlinkPath); auto s = targetPath.native(); printf("%s\n", s.c_str()); return 0; } catch (const std::exception& e) { fprintf(stderr, "%s\n", e.what()); return 1; } } On Linux it fails with the following message: filesystem error: read_symlink: Invalid argument [/proc/self] When run with strace I get this: ... lstat("/proc/self", {st_mode=S_IFLNK|0777, st_size=0, ...}) = 0 readlink("/proc/self", 0x7ffe21d33700, 0) = -1 EINVAL (Invalid argument) ... Indeed in libstdc++-v3/src/filesystem/ops.cc the readlink call is preceeded by a lstat call to determine the size of the buffer. This does not work with Linux's /proc (or /sys for that matter), since the st_size of pseudo-filesystem links is always zero. Boost's read_symlink follows a different approach: it starts with a 64-byte buffer and double its size until readlink succeeds.