diff --git a/src/libstore/normalise.cc b/src/libstore/normalise.cc
index 51f90207ead365803e93e47a9dd308ee309047db..5c13f04ecbfd6f512eb508919851d86a66c52d2f 100644
--- a/src/libstore/normalise.cc
+++ b/src/libstore/normalise.cc
@@ -287,6 +287,12 @@ void ensurePath(const Path & path, PathSet pending)
 {
     /* If the path is already valid, we're done. */
     if (isValidPath(path)) return;
+
+    if (pending.find(path) != pending.end())
+      throw Error(format(
+          "path `%1%' already being realised (possible substitute cycle?)")
+	  % path);
+    pending.insert(path);
     
     /* Otherwise, try the substitutes. */
     Paths subPaths = querySubstitutes(path);
@@ -296,7 +302,8 @@ void ensurePath(const Path & path, PathSet pending)
     {
         checkInterrupt();
         try {
-            normaliseStoreExpr(*i, pending);
+            Path nf = normaliseStoreExpr(*i, pending);
+	    realiseClosure(nf, pending);
             if (isValidPath(path)) return;
             throw Error(format("substitute failed to produce expected output path"));
         } catch (Error & e) {