Don't chmod symlink before moving outputs around

Co-authored-by: Théophane Hufschmitt <regnat@users.noreply.github.com>
This commit is contained in:
John Ericson 2020-09-04 14:38:45 +00:00
parent b99062b023
commit c9f1ed912c
2 changed files with 11 additions and 3 deletions

View file

@ -2065,7 +2065,7 @@ void linkOrCopy(const Path & from, const Path & to)
file (e.g. 32000 of ext3), which is quite possible after a file (e.g. 32000 of ext3), which is quite possible after a
'nix-store --optimise'. FIXME: actually, why don't we just 'nix-store --optimise'. FIXME: actually, why don't we just
bind-mount in this case? bind-mount in this case?
It can also fail with EPERM in BeegFS v7 and earlier versions It can also fail with EPERM in BeegFS v7 and earlier versions
which don't allow hard-links to other directories */ which don't allow hard-links to other directories */
if (errno != EMLINK && errno != EPERM) if (errno != EMLINK && errno != EPERM)
@ -4101,8 +4101,13 @@ void DerivationGoal::registerOutputs()
if (lstat(actualPath.c_str(), &st)) if (lstat(actualPath.c_str(), &st))
throw SysError("getting attributes of path '%1%'", actualPath); throw SysError("getting attributes of path '%1%'", actualPath);
mode |= 0200; mode |= 0200;
if (chmod(actualPath.c_str(), mode) == -1) /* Try to change the perms, but only if the file isn't a
throw SysError("changing mode of '%1%' to %2$o", actualPath, mode); symlink as symlinks permissions are mostly ignored and
calling `chmod` on it will just forward the call to the
target of the link. */
if (!S_ISLNK(st.st_mode))
if (chmod(actualPath.c_str(), mode) == -1)
throw SysError("changing mode of '%1%' to %2$o", actualPath, mode);
} }
if (rename( if (rename(
actualPath.c_str(), actualPath.c_str(),

View file

@ -16,11 +16,14 @@ rec {
}; };
rootCA = mkDerivation { rootCA = mkDerivation {
name = "dependent"; name = "dependent";
outputs = [ "out" "dev" ];
buildCommand = '' buildCommand = ''
echo "building a CA derivation" echo "building a CA derivation"
echo "The seed is ${toString seed}" echo "The seed is ${toString seed}"
mkdir -p $out mkdir -p $out
echo ${rootLegacy}/hello > $out/dep echo ${rootLegacy}/hello > $out/dep
# test symlink at root
ln -s $out $dev
''; '';
__contentAddressed = true; __contentAddressed = true;
outputHashMode = "recursive"; outputHashMode = "recursive";