From: LLVM Packaging Team Date: Mon, 30 Dec 2019 14:31:05 +0000 (+0000) Subject: D54677-hurd-path_max X-Git-Tag: archive/raspbian/1%7.0.1-8+rpi3+deb10u2~29 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=799e46d051b140567fbd700320c9d1e47bb0bec0;p=llvm-toolchain-7.git D54677-hurd-path_max [hurd] Fix unconditional use of PATH_MAX The GNU/Hurd system does not define an arbitrary PATH_MAX limitation, the POSIX 2001 realpath extension can be used instead, and the size of symlinks can be determined. https://reviews.llvm.org/D54677 Gbp-Pq: Topic hurd Gbp-Pq: Name D54677-hurd-path_max.diff --- diff --git a/libcxx/src/filesystem/operations.cpp b/libcxx/src/filesystem/operations.cpp index c9396b59c..248cf6e1f 100644 --- a/libcxx/src/filesystem/operations.cpp +++ b/libcxx/src/filesystem/operations.cpp @@ -530,11 +530,20 @@ path __canonical(path const& orig_p, error_code* ec) { ErrorHandler err("canonical", ec, &orig_p, &cwd); path p = __do_absolute(orig_p, &cwd, ec); +#if _POSIX_VERSION >= 200112 || defined(__GLIBC__) + char *buff; + if ((buff = ::realpath(p.c_str(), NULL)) == nullptr) + return err.report(capture_errno()); + path ret = {buff}; + free(buff); + return ret; +#else char buff[PATH_MAX + 1]; char* ret; if ((ret = ::realpath(p.c_str(), buff)) == nullptr) return err.report(capture_errno()); return {ret}; +#endif } void __copy(const path& from, const path& to, copy_options options, @@ -1076,16 +1085,27 @@ void __permissions(const path& p, perms prms, perm_options opts, path __read_symlink(const path& p, error_code* ec) { ErrorHandler err("read_symlink", ec, &p); - char buff[PATH_MAX + 1]; - error_code m_ec; + struct stat sb; + if (lstat(p.c_str(), &sb) == -1) { + return err.report(capture_errno()); + } + size_t size = sb.st_size + 1; + char *buff = (char*) malloc(size); + if (buff == NULL) { + return err.report(capture_errno()); + } + ::ssize_t ret; - if ((ret = ::readlink(p.c_str(), buff, PATH_MAX)) == -1) { + if ((ret = ::readlink(p.c_str(), buff, size)) == -1) { + free(buff); return err.report(capture_errno()); } - _LIBCPP_ASSERT(ret <= PATH_MAX, "TODO"); + _LIBCPP_ASSERT(ret < size, "TODO"); _LIBCPP_ASSERT(ret > 0, "TODO"); buff[ret] = 0; - return {buff}; + path res = {buff}; + free(buff); + return res; } bool __remove(const path& p, error_code* ec) {