mirror of
https://github.com/NixOS/nix.git
synced 2024-11-22 14:52:55 +00: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.
14 lines
392 B
Nix
14 lines
392 B
Nix
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;
|
|
}
|