summaryrefslogtreecommitdiffstats
path: root/src/libutil/archive.cc
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/libutil/archive.cc
parent92aee1b7d69adc9552dc0efae9d030e02aa2f353 (diff)
parent6b9a03f5d878ae434b54bb883b51e28082dc30b3 (diff)
Merge branch 'fix/avoid-large-stack-buffers' of https://github.com/dtzWill/nix
Diffstat (limited to 'src/libutil/archive.cc')
-rw-r--r--src/libutil/archive.cc18
1 files changed, 9 insertions, 9 deletions
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;
}