From 2e009ae7cdaee4ce871b3a79d50118762ee29fb6 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Mon, 17 Jul 2017 15:00:01 +0200 Subject: daemon: Flush the sink upon 'exportPath' errors. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- nix/nix-daemon/nix-daemon.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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); -- cgit v1.2.3