Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/HierarchyManagerImpl.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/HierarchyManagerImpl.java	(revision 1310685)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/HierarchyManagerImpl.java	(working copy)
@@ -19,6 +19,7 @@
 import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.Set;
+import java.util.TreeSet;
 
 import javax.jcr.ItemNotFoundException;
 import javax.jcr.RepositoryException;
@@ -258,7 +259,7 @@
      * @param builder builder currently being used
      * @param state   item to find path of
      */
-    protected void buildPath(PathBuilder builder, ItemState state)
+    protected void buildPath(PathBuilder builder, ItemState state, Set<NodeId> ids)
             throws ItemStateException, RepositoryException {
 
         // shortcut
@@ -275,9 +276,14 @@
             throw new ItemNotFoundException(msg);
         }
 
+        if (ids.contains(parentId)) {
+            throw new ItemStateException("cyclic path detected");
+        }
+        ids.add(parentId);
+
         NodeState parent = (NodeState) getItemState(parentId);
         // recursively build path of parent
-        buildPath(builder, parent);
+        buildPath(builder, parent, ids);
 
         if (state.isNode()) {
             NodeState nodeState = (NodeState) state;
@@ -392,7 +398,7 @@
         PathBuilder builder = new PathBuilder();
 
         try {
-            buildPath(builder, getItemState(id));
+            buildPath(builder, getItemState(id), new TreeSet<NodeId>());
             return builder.getPath();
         } catch (NoSuchItemStateException nsise) {
             String msg = "failed to build path of " + id;
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java	(revision 1310685)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java	(working copy)
@@ -21,6 +21,7 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 
 import javax.jcr.ItemNotFoundException;
 import javax.jcr.PathNotFoundException;
@@ -176,7 +177,7 @@
      * being used. If no mapping is found, the item is cached instead after
      * the base implementation has been invoked.
      */
-    protected void buildPath(PathBuilder builder, ItemState state)
+    protected void buildPath(PathBuilder builder, ItemState state, Set<NodeId> ids)
             throws ItemStateException, RepositoryException {
 
         if (state.isNode()) {
@@ -196,7 +197,7 @@
             }
         }
 
-        super.buildPath(builder, state);
+        super.buildPath(builder, state, ids);
 
         if (state.isNode()) {
             try {
