mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-23 14:36:16 +02:00
d038a67bd3
This removes a dynamic stack allocation, making the derivation unparsing logic robust against overflows when large strings are added to a derivation. Overflow behavior depends on the platform and stack configuration. For instance, x86_64-linux/glibc behaves as (somewhat) expected: $ (ulimit -s 20000; nix-instantiate tests/lang/eval-okay-big-derivation-attr.nix) error: stack overflow (possible infinite recursion) $ (ulimit -s 40000; nix-instantiate tests/lang/eval-okay-big-derivation-attr.nix) error: expression does not evaluate to a derivation (or a set or list of those) However, on aarch64-darwin: $ nix-instantiate big-attr.nix ~ zsh: segmentation fault nix-instantiate big-attr.nix This indicates a slight flaw in the single stack protection page approach that is not encountered with normal stack frames.
33 lines
1.1 KiB
Bash
33 lines
1.1 KiB
Bash
source common.sh
|
|
|
|
drvPath=$(nix-instantiate simple.nix)
|
|
|
|
test "$(nix-store -q --binding system "$drvPath")" = "$system"
|
|
|
|
echo "derivation is $drvPath"
|
|
|
|
outPath=$(nix-store -rvv "$drvPath")
|
|
|
|
echo "output path is $outPath"
|
|
|
|
(! [ -w $outPath ])
|
|
|
|
text=$(cat "$outPath"/hello)
|
|
if test "$text" != "Hello World!"; then exit 1; fi
|
|
|
|
# Directed delete: $outPath is not reachable from a root, so it should
|
|
# be deleteable.
|
|
nix-store --delete $outPath
|
|
(! [ -e $outPath/hello ])
|
|
|
|
outPath="$(NIX_REMOTE=local?store=/foo\&real=$TEST_ROOT/real-store nix-instantiate --readonly-mode hash-check.nix)"
|
|
if test "$outPath" != "/foo/lfy1s6ca46rm5r6w4gg9hc0axiakjcnm-dependencies.drv"; then
|
|
echo "hashDerivationModulo appears broken, got $outPath"
|
|
exit 1
|
|
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
|