diff -Naur a/toys/posix/du.c b/toys/posix/du.c
--- a/toys/posix/du.c	2014-10-02 18:23:27.000000000 +0530
+++ b/toys/posix/du.c	2014-10-07 08:51:40.590898777 +0530
@@ -101,6 +101,19 @@
   return 0;
 }
 
+// is recursive tree
+static int is_recursive_loop(struct dirtree *node)
+{
+  struct dirtree *tmp = node;
+
+  while ((tmp = tmp->parent)) {
+    if ((tmp->st.st_ino == node->st.st_ino) &&
+        (tmp->st.st_dev == node->st.st_dev))
+      return 1;
+  }
+  return 0;
+}
+
 // dirtree callback, comput/display size of node
 static int do_du(struct dirtree *node)
 {
@@ -114,6 +127,8 @@
   if (!(toys.optflags & FLAG_l) && !node->again)
     if (seen_inode(&TT.inodes, &node->st)) return 0;
 
+  if (is_recursive_loop(node)) goto ADD;
+
   // Collect child info before printing directory size
   if (S_ISDIR(node->st.st_mode)) {
     if (!node->again) {
@@ -121,7 +136,7 @@
       return DIRTREE_COMEAGAIN | (DIRTREE_SYMFOLLOW*!!(toys.optflags & FLAG_L));
     } else TT.depth--;
   }
-
+ADD:
   node->extra += node->st.st_blocks;
   if (node->parent) node->parent->extra += node->extra;
   else TT.total += node->extra;
