forked from lix-project/lix
Merge pull request #5875 from hercules-ci/fix-large-drv-field-stack-overflow
Fix segfault or stack overflow caused by large derivation fields
This commit is contained in:
commit
076945c808
|
@ -4,6 +4,7 @@
|
||||||
#include "util.hh"
|
#include "util.hh"
|
||||||
#include "worker-protocol.hh"
|
#include "worker-protocol.hh"
|
||||||
#include "fs-accessor.hh"
|
#include "fs-accessor.hh"
|
||||||
|
#include <boost/container/small_vector.hpp>
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
|
@ -272,7 +273,9 @@ Derivation parseDerivation(const Store & store, std::string && s, std::string_vi
|
||||||
|
|
||||||
static void printString(string & res, std::string_view s)
|
static void printString(string & res, std::string_view s)
|
||||||
{
|
{
|
||||||
char buf[s.size() * 2 + 2];
|
boost::container::small_vector<char, 64 * 1024> buffer;
|
||||||
|
buffer.reserve(s.size() * 2 + 2);
|
||||||
|
char * buf = buffer.data();
|
||||||
char * p = buf;
|
char * p = buf;
|
||||||
*p++ = '"';
|
*p++ = '"';
|
||||||
for (auto c : s)
|
for (auto c : s)
|
||||||
|
|
13
tests/big-derivation-attr.nix
Normal file
13
tests/big-derivation-attr.nix
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
let
|
||||||
|
sixteenBytes = "0123456789abcdef";
|
||||||
|
times16 = s: builtins.concatStringsSep "" [s s s s s s s s s s s s s s s s];
|
||||||
|
exp = n: x: if n == 1 then x else times16 (exp (n - 1) x);
|
||||||
|
sixteenMegabyte = exp 6 sixteenBytes;
|
||||||
|
in
|
||||||
|
assert builtins.stringLength sixteenMegabyte == 16777216;
|
||||||
|
derivation {
|
||||||
|
name = "big-derivation-attr";
|
||||||
|
builder = "/x";
|
||||||
|
system = "y";
|
||||||
|
bigAttr = sixteenMegabyte;
|
||||||
|
}
|
|
@ -25,3 +25,9 @@ if test "$outPath" != "/foo/lfy1s6ca46rm5r6w4gg9hc0axiakjcnm-dependencies.drv";
|
||||||
echo "hashDerivationModulo appears broken, got $outPath"
|
echo "hashDerivationModulo appears broken, got $outPath"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
outPath="$(NIX_REMOTE=local?store=/foo\&real=$TEST_ROOT/real-store nix-instantiate --readonly-mode big-derivation-attr.nix)"
|
||||||
|
if test "$outPath" != "/foo/xxiwa5zlaajv6xdjynf9yym9g319d6mn-big-derivation-attr.drv"; then
|
||||||
|
echo "big-derivation-attr.nix hash appears broken, got $outPath. Memory corruption in large drv attr?"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
Loading…
Reference in a new issue