PR libstdc++/79283 fix filesystem::read_symlink for /proc

Backport from mainline
2017-10-25  Jonathan Wakely  <jwakely@redhat.com>

	PR libstdc++/79283
	* src/filesystem/ops.cc (read_symlink): Handle st_size being zero.

From-SVN: r256286
This commit is contained in:
Jonathan Wakely 2018-01-05 21:27:20 +00:00 committed by Jonathan Wakely
parent d7e9a32ab0
commit df7dd7127c
2 changed files with 36 additions and 9 deletions

View File

@ -1,3 +1,11 @@
2018-01-05 Jonathan Wakely <jwakely@redhat.com>
Backport from mainline
2017-10-25 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/79283
* src/filesystem/ops.cc (read_symlink): Handle st_size being zero.
2018-01-04 Ville Voutilainen <ville.voutilainen@gmail.com>
Backport from mainline

View File

@ -1199,26 +1199,45 @@ fs::read_symlink(const path& p)
fs::path fs::read_symlink(const path& p, error_code& ec)
{
path result;
#ifdef _GLIBCXX_HAVE_SYS_STAT_H
stat_type st;
if (::lstat(p.c_str(), &st))
{
ec.assign(errno, std::generic_category());
return {};
return result;
}
std::string buf(st.st_size, '\0');
ssize_t len = ::readlink(p.c_str(), &buf.front(), buf.size());
if (len == -1)
std::string buf(st.st_size ? st.st_size + 1 : 128, '\0');
do
{
ec.assign(errno, std::generic_category());
return {};
ssize_t len = ::readlink(p.c_str(), &buf.front(), buf.size());
if (len == -1)
{
ec.assign(errno, std::generic_category());
return result;
}
else if (len == (ssize_t)buf.size())
{
if (buf.size() > 4096)
{
ec.assign(ENAMETOOLONG, std::generic_category());
return result;
}
buf.resize(buf.size() * 2);
}
else
{
buf.resize(len);
result.assign(buf);
ec.clear();
break;
}
}
ec.clear();
return path{buf.data(), buf.data()+len};
while (true);
#else
ec = std::make_error_code(std::errc::not_supported);
return {};
#endif
return result;
}