From 98b07466fbb9fc736bba0b93731117fd650e7349 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 5 Aug 2008 10:57:53 +0000 Subject: [PATCH] * Better error checking of the data from the substituters. --- src/libstore/local-store.cc | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index ccf1a51bc5..d8ac9820ff 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -520,6 +520,16 @@ void LocalStore::startSubstituter(const Path & substituter, RunningSubstituter & } +template T getIntLine(std::istream & str) +{ + string s; + T res; + getline(str, s); + if (!str || !string2Int(s, res)) throw Error("integer expected from stream"); + return res; +} + + bool LocalStore::hasSubstitutes(const Path & path) { foreach (Paths::iterator, i, substituters) { @@ -528,13 +538,7 @@ bool LocalStore::hasSubstitutes(const Path & path) *run.to << "have\n" << path << "\n" << std::flush; - string s; - - int res; - getline(*run.from, s); - if (!string2Int(s, res)) abort(); - - if (res) return true; + if (getIntLine(*run.from)) return true; } return false; @@ -549,26 +553,17 @@ bool LocalStore::querySubstitutablePathInfo(const Path & substituter, *run.to << "info\n" << path << "\n" << std::flush; - string s; - - int res; - getline(*run.from, s); - if (!string2Int(s, res)) abort(); - - if (!res) return false; + if (!getIntLine(*run.from)) return false; getline(*run.from, info.deriver); - int nrRefs; - getline(*run.from, s); - if (!string2Int(s, nrRefs)) abort(); + if (info.deriver != "") assertStorePath(info.deriver); + int nrRefs = getIntLine(*run.from); while (nrRefs--) { Path p; getline(*run.from, p); + assertStorePath(p); info.references.insert(p); } - getline(*run.from, s); - long long size; - if (!string2Int(s, size)) abort(); - info.downloadSize = size; + info.downloadSize = getIntLine(*run.from); return true; }