~ruther/guix-local

2e009ae7cdaee4ce871b3a79d50118762ee29fb6 — Jan Nieuwenhuizen 8 years ago 7ad2a4f
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>
1 files changed, 9 insertions(+), 1 deletions(-)

M nix/nix-daemon/nix-daemon.cc
M nix/nix-daemon/nix-daemon.cc => nix/nix-daemon/nix-daemon.cc +9 -1
@@ 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);