diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2018-04-09T19·26+0200 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2018-05-30T11·46+0200 |
commit | a4c16188760fde2122df534f5db6b9ef26c9bc22 (patch) | |
tree | ab127385cd87cd691b2de2e05989b1297cdff532 | |
parent | 7d21863bb3f3d4c42b273a8648a65bec83fe0b60 (diff) |
Fix deadlock in RemoteStore::queryPathInfoUncached()
-rw-r--r-- | src/libstore/remote-store.cc | 53 |
1 files changed, 28 insertions, 25 deletions
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index b72c940cdcf9..76b5660355ed 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(); } |