aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2009-12-24 02:27:30 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2010-03-05 09:01:22 -0500
commitc99658fe970f442199733bcace1a00b087336a0d (patch)
treeb9065b274d8f00639af43bbb8e4eaabcda5b559d
parenta1e28038df98e186807ff55a49c1c26d33d530a5 (diff)
bail out with ELOOP earlier in do_link loop
If we'd passed through 32 trailing symlinks already, there's no sense following the 33rd - we'll bail out anyway. Better bugger off earlier. It *does* change behaviour, after a fashion - if the 33rd happens to be a procfs-style symlink, original code *would* allow it. This one will not. Cry me a river if that hurts you. Please, do. And post a video of that, while you are at it. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/namei.c7
1 files changed, 1 insertions, 6 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 976fc323272e..84f1ec3b4a5d 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -1873,7 +1873,7 @@ exit_parent:
1873 1873
1874do_link: 1874do_link:
1875 error = -ELOOP; 1875 error = -ELOOP;
1876 if (flag & O_NOFOLLOW) 1876 if ((flag & O_NOFOLLOW) || count++ == 32)
1877 goto exit_dput; 1877 goto exit_dput;
1878 /* 1878 /*
1879 * This is subtle. Instead of calling do_follow_link() we do the 1879 * This is subtle. Instead of calling do_follow_link() we do the
@@ -1915,11 +1915,6 @@ do_link:
1915 __putname(nd.last.name); 1915 __putname(nd.last.name);
1916 goto exit; 1916 goto exit;
1917 } 1917 }
1918 error = -ELOOP;
1919 if (count++==32) {
1920 __putname(nd.last.name);
1921 goto exit;
1922 }
1923 filp = do_last(&nd, &path, open_flag, flag, acc_mode, mode, 1918 filp = do_last(&nd, &path, open_flag, flag, acc_mode, mode,
1924 pathname, &is_link); 1919 pathname, &is_link);
1925 __putname(nd.last.name); 1920 __putname(nd.last.name);