about summary refs log tree commit diff
path: root/src/libstore/store.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2004-02-14T21·44+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2004-02-14T21·44+0000
commit76c0e85929dc747288a8fe66a7bb77673cf2aa7e (patch)
treea470529f9acd56ac6af84bf426628c33a8affebf /src/libstore/store.cc
parent6f5a5ea5ea7fa80bc709c4a2b14ea4395ebe7469 (diff)
* The environment variable NIX_ROOT can now be set to execute Nix in a
  chroot() environment.
* A operation `--validpath' to register path validity.  Useful for
  bootstrapping in a pure Nix environment.
* Safety checks: ensure that files involved in store operations are in
  the store.

Diffstat (limited to 'src/libstore/store.cc')
-rw-r--r--src/libstore/store.cc38
1 files changed, 29 insertions, 9 deletions
diff --git a/src/libstore/store.cc b/src/libstore/store.cc
index 4cd77796ea..d85b0608f4 100644
--- a/src/libstore/store.cc
+++ b/src/libstore/store.cc
@@ -157,6 +157,22 @@ void copyPath(const Path & src, const Path & dst)
 }
 
 
+static bool isInStore(const Path & path)
+{
+    return path[0] == '/'
+        && Path(path, 0, nixStore.size()) == nixStore
+        && path.size() > nixStore.size() + 1
+        && path[nixStore.size()] == '/';
+}
+
+
+static void assertStorePath(const Path & path)
+{
+    if (!isInStore(path))
+        throw Error(format("path `%1%' is not in the Nix store") % path);
+}
+
+
 static bool isValidPathTxn(const Path & path, const Transaction & txn)
 {
     string s;
@@ -182,6 +198,9 @@ static bool isUsablePathTxn(const Path & path, const Transaction & txn)
 void registerSuccessor(const Transaction & txn,
     const Path & srcPath, const Path & sucPath)
 {
+    assertStorePath(srcPath);
+    assertStorePath(sucPath);
+    
     if (!isUsablePathTxn(sucPath, txn))	throw Error(
 	format("path `%1%' cannot be a successor, since it is not usable")
 	% sucPath);
@@ -223,6 +242,9 @@ Paths queryPredecessors(const Path & sucPath)
 
 void registerSubstitute(const Path & srcPath, const Path & subPath)
 {
+    assertStorePath(srcPath);
+    assertStorePath(subPath);
+    
     if (!isValidPathTxn(subPath, noTxn)) throw Error(
 	format("path `%1%' cannot be a substitute, since it is not valid")
 	% subPath);
@@ -262,6 +284,7 @@ Paths querySubstitutes(const Path & srcPath)
 void registerValidPath(const Transaction & txn, const Path & _path)
 {
     Path path(canonPath(_path));
+    assertStorePath(path);
     debug(format("registering path `%1%'") % path);
     nixDB.setString(txn, dbValidPaths, path, "");
 }
@@ -312,13 +335,6 @@ static void invalidatePath(const Path & path, Transaction & txn)
 }
 
 
-static bool isInPrefix(const string & path, const string & _prefix)
-{
-    string prefix = canonPath(_prefix + "/");
-    return string(path, 0, prefix.size()) == prefix;
-}
-
-
 Path addToStore(const Path & _srcPath)
 {
     Path srcPath(absPath(_srcPath));
@@ -355,6 +371,8 @@ Path addToStore(const Path & _srcPath)
 
 void addTextToStore(const Path & dstPath, const string & s)
 {
+    assertStorePath(dstPath);
+    
     if (!isValidPath(dstPath)) {
 
         PathSet lockPaths;
@@ -378,8 +396,7 @@ void deleteFromStore(const Path & _path)
 {
     Path path(canonPath(_path));
 
-    if (!isInPrefix(path, nixStore))
-        throw Error(format("path `%1%' is not in the store") % path);
+    assertStorePath(path);
 
     Transaction txn(nixDB);
     invalidatePath(path, txn);
@@ -402,6 +419,9 @@ void verifyStore()
         if (!pathExists(path)) {
             printMsg(lvlError, format("path `%1%' disappeared") % path);
             invalidatePath(path, txn);
+        } else if (!isInStore(path)) {
+            printMsg(lvlError, format("path `%1%' is not in the Nix store") % path);
+            invalidatePath(path, txn);
         } else
             validPaths.insert(path);
     }