From 9fcd3bffc2f6d5d91d72973eca3cc5b2993fddba Mon Sep 17 00:00:00 2001 From: Maximilian Bosch Date: Wed, 20 Feb 2019 10:41:20 +0100 Subject: [PATCH] buildEnv: improve file check to avoid false-positives The original change in #55372 was supposed to fix the case where a store path which is a file should be placed into `buildEnv` which broke with a fairly misleading Perl error. Unfortunately this introduced a regression, `findFiles` can have targets that are files if the file isn't a store path. Rather than adding more obscure checks with probably further regressions, I figured that it's better to replicate the behavior of `lib.isStorePath` and explicitly check if the store path is a file and break in this case only. This should also fix recent staging issues. --- pkgs/build-support/buildenv/builder.pl | 12 ++++++++++-- pkgs/build-support/buildenv/default.nix | 11 +++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/pkgs/build-support/buildenv/builder.pl b/pkgs/build-support/buildenv/builder.pl index 1f77edf86cb..b699d762d29 100755 --- a/pkgs/build-support/buildenv/builder.pl +++ b/pkgs/build-support/buildenv/builder.pl @@ -26,6 +26,13 @@ sub isInPathsToLink { return 0; } +# Similar to `lib.isStorePath` +sub isStorePath { + my $path = shift; + my $storePath = "@storeDir@"; + + return substr($path, 0, 1) eq "/" && dirname($path) eq $storePath; +} # For each activated package, determine what symlinks to create. @@ -84,8 +91,9 @@ sub checkCollision { sub findFiles { my ($relName, $target, $baseName, $ignoreCollisions, $checkCollisionContents, $priority) = @_; - if (-f $target) { - die "Path $target is a file and can't be merged into an environment using pkgs.buildEnv!"; + # The store path must not be a file + if (-f $target && isStorePath $target) { + die "The store path $target is a file and can't be merged into an environment using pkgs.buildEnv!"; } # Urgh, hacky... diff --git a/pkgs/build-support/buildenv/default.nix b/pkgs/build-support/buildenv/default.nix index 41a1e67ef42..f858048d694 100644 --- a/pkgs/build-support/buildenv/default.nix +++ b/pkgs/build-support/buildenv/default.nix @@ -2,7 +2,7 @@ # a fork of the buildEnv in the Nix distribution. Most changes should # eventually be merged back into the Nix distribution. -{ buildPackages, runCommand, lib }: +{ buildPackages, runCommand, lib, substituteAll }: lib.makeOverridable ({ name @@ -43,6 +43,13 @@ lib.makeOverridable , meta ? {} }: +let + builder = substituteAll { + src = ./builder.pl; + inherit (builtins) storeDir; + }; +in + runCommand name rec { inherit manifest ignoreCollisions checkCollisionContents passthru @@ -67,6 +74,6 @@ runCommand name passAsFile = if builtins.stringLength pkgs >= 128*1024 then [ "pkgs" ] else null; } '' - ${buildPackages.perl}/bin/perl -w ${./builder.pl} + ${buildPackages.perl}/bin/perl -w ${builder} eval "$postBuild" '')