aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2018-03-22 13:19:25 +0100
committerEelco Dolstra <edolstra@gmail.com>2018-03-22 13:19:25 +0100
commitf87e286e82f37c3746ba62ba5503db90277eeb6e (patch)
tree627a0914bf495a43969a3448d0a05049a5b078ea /src
parent92aee1b7d69adc9552dc0efae9d030e02aa2f353 (diff)
parent6b9a03f5d878ae434b54bb883b51e28082dc30b3 (diff)
Merge branch 'fix/avoid-large-stack-buffers' of https://github.com/dtzWill/nix
Diffstat (limited to 'src')
-rw-r--r--src/libstore/build.cc6
-rw-r--r--src/libutil/archive.cc18
-rw-r--r--src/libutil/hash.cc6
-rw-r--r--src/libutil/util.cc17
-rw-r--r--src/nix-daemon/nix-daemon.cc6
5 files changed, 27 insertions, 26 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index 082cd7db0..73139d6d5 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -4161,10 +4161,10 @@ void Worker::waitForInput()
assert(goal);
set<int> fds2(j->fds);
+ std::vector<unsigned char> buffer(4096);
for (auto & k : fds2) {
if (FD_ISSET(k, &fds)) {
- unsigned char buffer[4096];
- ssize_t rd = read(k, buffer, sizeof(buffer));
+ ssize_t rd = read(k, buffer.data(), buffer.size());
if (rd == -1) {
if (errno != EINTR)
throw SysError(format("reading from %1%")
@@ -4176,7 +4176,7 @@ void Worker::waitForInput()
} else {
printMsg(lvlVomit, format("%1%: read %2% bytes")
% goal->getName() % rd);
- string data((char *) buffer, rd);
+ string data((char *) buffer.data(), rd);
j->lastOutput = after;
goal->handleChildOutput(k, data);
}
diff --git a/src/libutil/archive.cc b/src/libutil/archive.cc
index a1d9d3233..b2459336a 100644
--- a/src/libutil/archive.cc
+++ b/src/libutil/archive.cc
@@ -40,14 +40,14 @@ static void dumpContents(const Path & path, size_t size,
AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_CLOEXEC);
if (!fd) throw SysError(format("opening file '%1%'") % path);
- unsigned char buf[65536];
+ std::vector<unsigned char> buf(65536);
size_t left = size;
while (left > 0) {
- size_t n = left > sizeof(buf) ? sizeof(buf) : left;
- readFull(fd.get(), buf, n);
+ size_t n = left > buf.size() ? buf.size() : left;
+ readFull(fd.get(), buf.data(), n);
left -= n;
- sink(buf, n);
+ sink(buf.data(), n);
}
writePadding(size, sink);
@@ -146,14 +146,14 @@ static void parseContents(ParseSink & sink, Source & source, const Path & path)
sink.preallocateContents(size);
unsigned long long left = size;
- unsigned char buf[65536];
+ std::vector<unsigned char> buf(65536);
while (left) {
checkInterrupt();
- unsigned int n = sizeof(buf);
- if ((unsigned long long) n > left) n = left;
- source(buf, n);
- sink.receiveContents(buf, n);
+ auto n = buf.size();
+ if ((unsigned long long)n > left) n = left;
+ source(buf.data(), n);
+ sink.receiveContents(buf.data(), n);
left -= n;
}
diff --git a/src/libutil/hash.cc b/src/libutil/hash.cc
index 150995f55..a01d651e1 100644
--- a/src/libutil/hash.cc
+++ b/src/libutil/hash.cc
@@ -257,12 +257,12 @@ Hash hashFile(HashType ht, const Path & path)
AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_CLOEXEC);
if (!fd) throw SysError(format("opening file '%1%'") % path);
- unsigned char buf[8192];
+ std::vector<unsigned char> buf(8192);
ssize_t n;
- while ((n = read(fd.get(), buf, sizeof(buf)))) {
+ while ((n = read(fd.get(), buf.data(), buf.size()))) {
checkInterrupt();
if (n == -1) throw SysError(format("reading file '%1%'") % path);
- update(ht, ctx, buf, n);
+ update(ht, ctx, buf.data(), n);
}
finish(ht, ctx, hash.hash);
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index ab2d097f8..15962236e 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;
diff --git a/src/nix-daemon/nix-daemon.cc b/src/nix-daemon/nix-daemon.cc
index 50258018a..f28a52b73 100644
--- a/src/nix-daemon/nix-daemon.cc
+++ b/src/nix-daemon/nix-daemon.cc
@@ -37,13 +37,13 @@ using namespace nix;
static ssize_t splice(int fd_in, void *off_in, int fd_out, void *off_out, size_t len, unsigned int flags)
{
/* We ignore most parameters, we just have them for conformance with the linux syscall */
- char buf[8192];
- auto read_count = read(fd_in, buf, sizeof(buf));
+ std::vector<char> buf(8192);
+ auto read_count = read(fd_in, buf.data(), buf.size());
if (read_count == -1)
return read_count;
auto write_count = decltype(read_count)(0);
while (write_count < read_count) {
- auto res = write(fd_out, buf + write_count, read_count - write_count);
+ auto res = write(fd_out, buf.data() + write_count, read_count - write_count);
if (res == -1)
return res;
write_count += res;