Commit c99658fe authored by Al Viro's avatar Al Viro

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: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent a1e28038
...@@ -1873,7 +1873,7 @@ struct file *do_filp_open(int dfd, const char *pathname, ...@@ -1873,7 +1873,7 @@ struct file *do_filp_open(int dfd, const char *pathname,
do_link: do_link:
error = -ELOOP; error = -ELOOP;
if (flag & O_NOFOLLOW) if ((flag & O_NOFOLLOW) || count++ == 32)
goto exit_dput; goto exit_dput;
/* /*
* This is subtle. Instead of calling do_follow_link() we do the * This is subtle. Instead of calling do_follow_link() we do the
...@@ -1915,11 +1915,6 @@ struct file *do_filp_open(int dfd, const char *pathname, ...@@ -1915,11 +1915,6 @@ struct file *do_filp_open(int dfd, const char *pathname,
__putname(nd.last.name); __putname(nd.last.name);
goto exit; goto exit;
} }
error = -ELOOP;
if (count++==32) {
__putname(nd.last.name);
goto exit;
}
filp = do_last(&nd, &path, open_flag, flag, acc_mode, mode, filp = do_last(&nd, &path, open_flag, flag, acc_mode, mode,
pathname, &is_link); pathname, &is_link);
__putname(nd.last.name); __putname(nd.last.name);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment