summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/tasktree.cc14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/tasktree.cc b/src/tasktree.cc
index c463177..39cee98 100644
--- a/src/tasktree.cc
+++ b/src/tasktree.cc
@@ -173,6 +173,17 @@ TaskIdList TaskTree::remove(taskid_t id)
return affectedNodes;
}
+static bool findNode(node_t *needle, node_t *haystack)
+{
+ if(needle == haystack) return true;
+ NodeList::iterator i = haystack->children.begin();
+ while(i != haystack->children.end()) {
+ if(findNode(needle, *i)) return true;
+ i++;
+ }
+ return false;
+}
+
TaskIdList TaskTree::move(taskid_t id, taskid_t toid)
throw (std::exception)
{
@@ -183,6 +194,9 @@ TaskIdList TaskTree::move(taskid_t id, taskid_t toid)
node_t* child = id2node.at(id);
node_t* newparent = id2node.at(toid);
+ // Test if new parent is a child of the node itself...
+ if(findNode(newparent, child)) throw std::exception();
+
if(!child->parent) {
throw std::exception();
}