aboutsummaryrefslogtreecommitdiff
path: root/src/libstore
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2018-04-09 21:26:16 +0200
committerEelco Dolstra <edolstra@gmail.com>2018-05-30 13:46:14 +0200
commita4c16188760fde2122df534f5db6b9ef26c9bc22 (patch)
treeab127385cd87cd691b2de2e05989b1297cdff532 /src/libstore
parent7d21863bb3f3d4c42b273a8648a65bec83fe0b60 (diff)
Fix deadlock in RemoteStore::queryPathInfoUncached()
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/remote-store.cc53
1 files changed, 28 insertions, 25 deletions
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index b72c940cd..76b566035 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -297,31 +297,34 @@ void RemoteStore::queryPathInfoUncached(const Path & path,
Callback<std::shared_ptr<ValidPathInfo>> callback)
{
try {
- auto conn(connections->get());
- conn->to << wopQueryPathInfo << path;
- try {
- conn->processStderr();
- } catch (Error & e) {
- // Ugly backwards compatibility hack.
- if (e.msg().find("is not valid") != std::string::npos)
- throw InvalidPath(e.what());
- throw;
- }
- if (GET_PROTOCOL_MINOR(conn->daemonVersion) >= 17) {
- bool valid; conn->from >> valid;
- if (!valid) throw InvalidPath(format("path '%s' is not valid") % path);
- }
- auto info = std::make_shared<ValidPathInfo>();
- info->path = path;
- info->deriver = readString(conn->from);
- if (info->deriver != "") assertStorePath(info->deriver);
- info->narHash = Hash(readString(conn->from), htSHA256);
- info->references = readStorePaths<PathSet>(*this, conn->from);
- conn->from >> info->registrationTime >> info->narSize;
- if (GET_PROTOCOL_MINOR(conn->daemonVersion) >= 16) {
- conn->from >> info->ultimate;
- info->sigs = readStrings<StringSet>(conn->from);
- conn->from >> info->ca;
+ std::shared_ptr<ValidPathInfo> info;
+ {
+ auto conn(connections->get());
+ conn->to << wopQueryPathInfo << path;
+ try {
+ conn->processStderr();
+ } catch (Error & e) {
+ // Ugly backwards compatibility hack.
+ if (e.msg().find("is not valid") != std::string::npos)
+ throw InvalidPath(e.what());
+ throw;
+ }
+ if (GET_PROTOCOL_MINOR(conn->daemonVersion) >= 17) {
+ bool valid; conn->from >> valid;
+ if (!valid) throw InvalidPath(format("path '%s' is not valid") % path);
+ }
+ info = std::make_shared<ValidPathInfo>();
+ info->path = path;
+ info->deriver = readString(conn->from);
+ if (info->deriver != "") assertStorePath(info->deriver);
+ info->narHash = Hash(readString(conn->from), htSHA256);
+ info->references = readStorePaths<PathSet>(*this, conn->from);
+ conn->from >> info->registrationTime >> info->narSize;
+ if (GET_PROTOCOL_MINOR(conn->daemonVersion) >= 16) {
+ conn->from >> info->ultimate;
+ info->sigs = readStrings<StringSet>(conn->from);
+ conn->from >> info->ca;
+ }
}
callback(std::move(info));
} catch (...) { callback.rethrow(); }