mirror of
https://github.com/NixOS/nix
synced 2025-06-27 00:11:17 +02:00
don't allocate large buffers on the stack
This commit is contained in:
parent
3748a0ca1e
commit
c89a3d5368
5 changed files with 30 additions and 29 deletions
|
@ -229,16 +229,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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -293,10 +294,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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -438,10 +439,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;
|
||||
|
@ -569,16 +570,16 @@ void writeFull(int fd, const string & s, bool allowInterrupts)
|
|||
string drainFD(int fd)
|
||||
{
|
||||
string result;
|
||||
unsigned char buffer[4096];
|
||||
std::vector<unsigned char> buffer(4096);
|
||||
while (1) {
|
||||
checkInterrupt();
|
||||
ssize_t rd = read(fd, buffer, sizeof buffer);
|
||||
ssize_t rd = read(fd, buffer.data(), buffer.size());
|
||||
if (rd == -1) {
|
||||
if (errno != EINTR)
|
||||
throw SysError("reading from file");
|
||||
}
|
||||
else if (rd == 0) break;
|
||||
else result.append((char *) buffer, rd);
|
||||
else result.append((char *) buffer.data(), rd);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue