aboutsummaryrefslogtreecommitdiff
path: root/nix/nix-daemon/nix-daemon.cc
diff options
context:
space:
mode:
authorJan Nieuwenhuizen <janneke@gnu.org>2017-07-17 15:00:01 +0200
committerLudovic Courtès <ludo@gnu.org>2017-07-17 15:13:41 +0200
commit2e009ae7cdaee4ce871b3a79d50118762ee29fb6 (patch)
tree0a8422362b075dc6d0338630f5bb6674e443265b /nix/nix-daemon/nix-daemon.cc
parent7ad2a4f1d50e5a397010ec90dba79feaca296a81 (diff)
downloadguix-2e009ae7cdaee4ce871b3a79d50118762ee29fb6.tar
guix-2e009ae7cdaee4ce871b3a79d50118762ee29fb6.tar.gz
daemon: Flush the sink upon 'exportPath' errors.
Prior to this change, errors such as wrong permissions on /etc/guix/signing-key.sec would give: guix-daemon: nix/libutil/serialise.cc:15: virtual nix::BufferedSink::~BufferedSink(): Assertion `!bufPos' failed. This patch correctly propagates the error to the client and thus changes that to: error: build failed: file `/etc/guix/signing-key.sec' should be secret (inaccessible to everybody else)! * nix/nix-daemon/nix-daemon.cc (performOp): Wrap 'exportPath' call in 'try' block. Co-authored-by: Ludovic Courtès <ludo@gnu.org>
Diffstat (limited to 'nix/nix-daemon/nix-daemon.cc')
-rw-r--r--nix/nix-daemon/nix-daemon.cc10
1 files changed, 9 insertions, 1 deletions
diff --git a/nix/nix-daemon/nix-daemon.cc b/nix/nix-daemon/nix-daemon.cc
index 7d26b61354..deb7003d7e 100644
--- a/nix/nix-daemon/nix-daemon.cc
+++ b/nix/nix-daemon/nix-daemon.cc
@@ -436,7 +436,15 @@ static void performOp(bool trusted, unsigned int clientVersion,
bool sign = readInt(from) == 1;
startWork();
TunnelSink sink(to);
- store->exportPath(path, sign, sink);
+ try {
+ store->exportPath(path, sign, sink);
+ }
+ catch (Error &e) {
+ /* Flush SINK beforehand or its destructor will rightfully trigger
+ an assertion failure. */
+ sink.flush();
+ throw e;
+ }
sink.flush();
stopWork();
writeInt(1, to);