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/archive.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/archive.cc')
-rw-r--r-- | src/libutil/archive.cc | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/src/libutil/archive.cc b/src/libutil/archive.cc index a1d9d3233a0e..b2459336a885 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; } |