diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2018-03-22T12·19+0100 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2018-03-22T12·19+0100 |
commit | f87e286e82f37c3746ba62ba5503db90277eeb6e (patch) | |
tree | 627a0914bf495a43969a3448d0a05049a5b078ea /src/libutil/util.cc | |
parent | 92aee1b7d69adc9552dc0efae9d030e02aa2f353 (diff) | |
parent | 6b9a03f5d878ae434b54bb883b51e28082dc30b3 (diff) |
Merge branch 'fix/avoid-large-stack-buffers' of https://github.com/dtzWill/nix
Diffstat (limited to 'src/libutil/util.cc')
-rw-r--r-- | src/libutil/util.cc | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/src/libutil/util.cc b/src/libutil/util.cc index ab2d097f8b62..15962236ec65 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -230,16 +230,17 @@ bool pathExists(const Path & path) Path readLink(const Path & path) { checkInterrupt(); + std::vector<char> buf; for (ssize_t bufSize = PATH_MAX/4; true; bufSize += bufSize/2) { - char buf[bufSize]; - ssize_t rlSize = readlink(path.c_str(), buf, bufSize); + buf.resize(bufSize); + ssize_t rlSize = readlink(path.c_str(), buf.data(), bufSize); if (rlSize == -1) if (errno == EINVAL) throw Error("'%1%' is not a symlink", path); else throw SysError("reading symbolic link '%1%'", path); else if (rlSize < bufSize) - return string(buf, rlSize); + return string(buf.data(), rlSize); } } @@ -294,10 +295,10 @@ string readFile(int fd) if (fstat(fd, &st) == -1) throw SysError("statting file"); - auto buf = std::make_unique<unsigned char[]>(st.st_size); - readFull(fd, buf.get(), st.st_size); + std::vector<unsigned char> buf(st.st_size); + readFull(fd, buf.data(), st.st_size); - return string((char *) buf.get(), st.st_size); + return string((char *) buf.data(), st.st_size); } @@ -439,10 +440,10 @@ Path createTempDir(const Path & tmpRoot, const Path & prefix, static Lazy<Path> getHome2([]() { Path homeDir = getEnv("HOME"); if (homeDir.empty()) { - char buf[16384]; + std::vector<char> buf(16384); struct passwd pwbuf; struct passwd * pw; - if (getpwuid_r(getuid(), &pwbuf, buf, sizeof(buf), &pw) != 0 + if (getpwuid_r(getuid(), &pwbuf, buf.data(), buf.size(), &pw) != 0 || !pw || !pw->pw_dir || !pw->pw_dir[0]) throw Error("cannot determine user's home directory"); homeDir = pw->pw_dir; |