From c5474398433225e40c8868b0952aebe36da2c849 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 8 Feb 2005 13:48:53 +0000 Subject: * Subflag in `--verify': `nix-store --verify --check-contents' checks that the contents of store paths has not changed by comparing hashes of their current contents to the hashes stored in the database. --- src/libstore/store.cc | 44 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 9 deletions(-) (limited to 'src/libstore/store.cc') diff --git a/src/libstore/store.cc b/src/libstore/store.cc index 0c7702f973bd..da60a62b0457 100644 --- a/src/libstore/store.cc +++ b/src/libstore/store.cc @@ -623,7 +623,23 @@ void deleteFromStore(const Path & _path) } -void verifyStore() +static Hash queryHash(const Transaction & txn, const Path & storePath) +{ + string s; + nixDB.queryString(txn, dbValidPaths, storePath, s); + unsigned int colon = s.find(':'); + if (colon == string::npos) + throw Error(format("corrupt hash `%1%' in valid-path entry for `%2%'") + % s % storePath); + HashType ht = parseHashType(string(s, 0, colon)); + if (ht == htUnknown) + throw Error(format("unknown hash type `%1%' in valid-path entry for `%2%'") + % string(0, colon) % storePath); + return parseHash(ht, string(s, colon + 1)); +} + + +void verifyStore(bool checkContents) { Transaction txn(nixDB); @@ -633,14 +649,24 @@ void verifyStore() for (Paths::iterator i = paths.begin(); i != paths.end(); ++i) { Path path = *i; - if (!pathExists(path)) { - printMsg(lvlError, format("path `%1%' disappeared") % path); - invalidatePath(path, txn); - } else if (!isStorePath(path)) { - printMsg(lvlError, format("path `%1%' is not in the Nix store") % path); - invalidatePath(path, txn); - } else - validPaths.insert(path); + if (!pathExists(*i)) { + printMsg(lvlError, format("path `%1%' disappeared") % *i); + invalidatePath(*i, txn); + } else if (!isStorePath(*i)) { + printMsg(lvlError, format("path `%1%' is not in the Nix store") % *i); + invalidatePath(*i, txn); + } else { + if (checkContents) { + Hash expected = queryHash(txn, *i); + Hash current = hashPath(expected.type, *i); + if (current != expected) { + printMsg(lvlError, format("path `%1%' was modified! " + "expected hash `%2%', got `%3%'") + % *i % printHash(expected) % printHash(current)); + } + } + validPaths.insert(*i); + } } /* "Usable" paths are those that are valid or have a -- cgit 1.4.1