aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libstore/remote-store.cc2
-rw-r--r--src/libstore/store-api.hh4
-rw-r--r--src/nix-worker/nix-worker.cc16
3 files changed, 16 insertions, 6 deletions
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 568a6aa58..0c6a1c37d 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -328,7 +328,7 @@ Path RemoteStore::addToStore(const Path & _srcPath,
openConnection();
Path srcPath(absPath(_srcPath));
-
+
writeInt(wopAddToStore, to);
writeString(baseNameOf(srcPath), to);
/* backwards compatibility hack */
diff --git a/src/libstore/store-api.hh b/src/libstore/store-api.hh
index 8bfb09880..e3a2c0daa 100644
--- a/src/libstore/store-api.hh
+++ b/src/libstore/store-api.hh
@@ -151,9 +151,7 @@ public:
/* Copy the contents of a path to the store and register the
validity the resulting path. The resulting path is returned.
- If `fixed' is true, then the output of a fixed-output
- derivation is pre-loaded into the Nix store. The function
- object `filter' can be used to exclude files (see
+ The function object `filter' can be used to exclude files (see
libutil/archive.hh). */
virtual Path addToStore(const Path & srcPath,
bool recursive = true, HashType hashAlgo = htSHA256,
diff --git a/src/nix-worker/nix-worker.cc b/src/nix-worker/nix-worker.cc
index 0fa1b40ae..d74b82df4 100644
--- a/src/nix-worker/nix-worker.cc
+++ b/src/nix-worker/nix-worker.cc
@@ -241,11 +241,14 @@ struct TunnelSource : Source
the contents of the file to `s'. Otherwise barf. */
struct RetrieveRegularNARSink : ParseSink
{
+ bool regular;
string s;
+ RetrieveRegularNARSink() : regular(true) { }
+
void createDirectory(const Path & path)
{
- throw Error("regular file expected");
+ regular = false;
}
void receiveContents(unsigned char * data, unsigned int len)
@@ -255,7 +258,7 @@ struct RetrieveRegularNARSink : ParseSink
void createSymlink(const Path & path, const string & target)
{
- throw Error("regular file expected");
+ regular = false;
}
};
@@ -363,6 +366,7 @@ static void performOp(unsigned int clientVersion,
parseDump(sink, savedNAR);
} else {
parseDump(savedRegular, from);
+ if (!savedRegular.regular) throw Error("regular file expected");
}
startWork();
@@ -638,7 +642,15 @@ static void processConnection()
try {
performOp(clientVersion, from, to, op);
} catch (Error & e) {
+ /* If we're not in a state were we can send replies, then
+ something went wrong processing the input of the
+ client. This can happen especially if I/O errors occur
+ during addTextToStore() / importPath(). If that
+ happens, just send the error message and exit. */
+ bool errorAllowed = canSendStderr;
+ if (!errorAllowed) printMsg(lvlError, format("error processing client input: %1%") % e.msg());
stopWork(false, e.msg(), GET_PROTOCOL_MINOR(clientVersion) >= 8 ? e.status : 0);
+ if (!errorAllowed) break;
}
assert(!canSendStderr);