nix-store --export, nix-store --dump, and nix dump-path would previously
fail silently if writing the data out failed, because
 a) FdSink::write ignored exceptions, and
 b) the commands relied on FdSink's destructor, which ignores
    exceptions, to flush the data out.

This could cause rather opaque issues with installing nixos, because
nix-store --export would happily proceed even if it couldn't write its
data out (e.g. if nix-store --import on the other side of the pipe
failed).

This commit adds tests that expose these issues in the nix-store
commands, and fixes them for all three.
This commit is contained in:
Linus Heckemann 2018-02-13 11:05:25 +00:00
parent c5cc57e962
commit 78ac3eb4eb
5 changed files with 16 additions and 1 deletions

View file

@ -67,7 +67,8 @@ void FdSink::write(const unsigned char * data, size_t len)
try {
writeFull(fd, data, len);
} catch (SysError & e) {
_good = true;
_good = false;
throw;
}
}

View file

@ -631,6 +631,7 @@ static void opDump(Strings opFlags, Strings opArgs)
FdSink sink(STDOUT_FILENO);
string path = *opArgs.begin();
dumpPath(path, sink);
sink.flush();
}
@ -656,6 +657,7 @@ static void opExport(Strings opFlags, Strings opArgs)
FdSink sink(STDOUT_FILENO);
store->exportPaths(opArgs, sink);
sink.flush();
}

View file

@ -29,6 +29,7 @@ struct CmdDumpPath : StorePathCommand
{
FdSink sink(STDOUT_FILENO);
store->narFromPath(storePath, sink);
sink.flush();
}
};

View file

@ -8,6 +8,11 @@ nix-store --export $outPath > $TEST_ROOT/exp
nix-store --export $(nix-store -qR $outPath) > $TEST_ROOT/exp_all
if nix-store --export $outPath >/dev/full ; then
echo "exporting to a bad file descriptor should fail"
exit 1
fi
clearStore

View file

@ -36,3 +36,9 @@ diff -u baz.cat-nar $storePath/foo/baz
# Test missing files.
nix ls-store --json -R $storePath/xyzzy 2>&1 | grep 'does not exist in NAR'
nix ls-store $storePath/xyzzy 2>&1 | grep 'does not exist'
# Test failure to dump.
if nix-store --dump $storePath >/dev/full ; then
echo "dumping to /dev/full should fail"
exit -1
fi