about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2016-04-22T10·15+0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2016-04-22T10·15+0200
commit0207272b28f1dad119b418dfafcfb18d22b6d3f6 (patch)
treecf273c38481a7dcec641bac7a07161e9a9bc00f7
parent21ef1670b3cb592ae504cca4e412082746affcfe (diff)
BinaryCacheStore: When adding a path, ensure the references are valid
This prevents copying a partial closure to a binary cache.
-rw-r--r--src/libstore/binary-cache-store.cc11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/libstore/binary-cache-store.cc b/src/libstore/binary-cache-store.cc
index 4445bfd27a12..93863b95fe7f 100644
--- a/src/libstore/binary-cache-store.cc
+++ b/src/libstore/binary-cache-store.cc
@@ -50,6 +50,17 @@ Path BinaryCacheStore::narInfoFileFor(const Path & storePath)
 void BinaryCacheStore::addToCache(const ValidPathInfo & info,
     const string & nar)
 {
+    /* Verify that all references are valid. This may do some .narinfo
+       reads, but typically they'll already be cached. */
+    for (auto & ref : info.references)
+        try {
+            if (ref != info.path)
+                queryPathInfo(ref);
+        } catch (InvalidPath &) {
+            throw Error(format("cannot add ‘%s’ to the binary cache because the reference ‘%s’ is not valid")
+                % info.path % ref);
+        }
+
     auto narInfoFile = narInfoFileFor(info.path);
     if (fileExists(narInfoFile)) return;