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:
parent
d7e9a32ab0
commit
df7dd7127c
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue