about summary refs log tree commit diff
path: root/src/libstore
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/store.cc20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/libstore/store.cc b/src/libstore/store.cc
index e792fd28cedc..556ba8e62166 100644
--- a/src/libstore/store.cc
+++ b/src/libstore/store.cc
@@ -76,10 +76,30 @@ static void upgradeStore07();
 static void upgradeStore09();
 
 
+void checkStoreNotSymlink()
+{
+    if (getEnv("NIX_IGNORE_SYMLINK_STORE") == "1") return;
+    Path path = nixStore;
+    struct stat st;
+    while (path != "/") {
+        if (lstat(path.c_str(), &st))
+            throw SysError(format("getting status of `%1%'") % path);
+        if (S_ISLNK(st.st_mode))
+            throw Error(format(
+                "the path `%1%' is a symlink; "
+                "this is not allowed for the Nix store and its parent directories")
+                % path);
+        path = dirOf(path);
+    }
+}
+
+
 void openDB(bool reserveSpace)
 {
     if (readOnlyMode) return;
 
+    checkStoreNotSymlink();
+
     try {
         Path reservedPath = nixDBPath + "/reserved";
         string s = querySetting("gc-reserved-space", "");