From 10e0d86c088a3eccc27095b51d753e05f3f3cbc8 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Mon, 1 Dec 2014 12:52:55 -0600 Subject: Ashwini Sharma pointed out that "mkdir sub; ln -s . sub/up; du -L sub" shouldn't loop endlessly. --- toys/posix/du.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'toys/posix/du.c') diff --git a/toys/posix/du.c b/toys/posix/du.c index 22a26d3a..00a7f68a 100644 --- a/toys/posix/du.c +++ b/toys/posix/du.c @@ -110,6 +110,15 @@ static int do_du(struct dirtree *node) if ((toys.optflags & FLAG_x) && (TT.st_dev != node->st.st_dev)) return 0; + // Don't loop endlessly on recursive directory symlink + if (toys.optflags & FLAG_L) { + struct dirtree *try = node; + + while ((try = try->parent)) + if (node->st.st_dev==try->st.st_dev && node->st.st_ino==try->st.st_ino) + return 0; + } + // Don't count hard links twice if (!(toys.optflags & FLAG_l) && !node->again) if (seen_inode(&TT.inodes, &node->st)) return 0; -- cgit v1.2.3