From: Al Viro <[email protected]>

Signed-off-by: Al Viro <[email protected]>
---
 fs/namei.c | 27 ++++++++++++---------------
 1 file changed, 12 insertions(+), 15 deletions(-)

diff --git a/fs/namei.c b/fs/namei.c
index 026d7df..9822b37 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -891,16 +891,10 @@ const char *get_link(struct nameidata *nd)
        if (nd->link.mnt == nd->path.mnt)
                mntget(nd->link.mnt);
 
-       if (unlikely(current->total_link_count >= MAXSYMLINKS)) {
-               path_put(&nd->link);
-               return ERR_PTR(-ELOOP);
-       }
-
        last->link = nd->link;
        last->cookie = NULL;
 
        cond_resched();
-       current->total_link_count++;
 
        touch_atime(&last->link);
 
@@ -1560,12 +1554,23 @@ static void terminate_walk(struct nameidata *nd)
 
 static int pick_link(struct nameidata *nd, struct path *link)
 {
+       int error;
+       if (unlikely(current->total_link_count++ >= MAXSYMLINKS)) {
+               path_to_nameidata(link, nd);
+               return -ELOOP;
+       }
        if (nd->flags & LOOKUP_RCU) {
                if (unlikely(nd->path.mnt != link->mnt ||
                             unlazy_walk(nd, link->dentry))) {
                        return -ECHILD;
                }
        }
+       error = nd_alloc_stack(nd);
+       if (unlikely(error)) {
+               path_to_nameidata(link, nd);
+               return error;
+       }
+
        nd->link = *link;
        return 1;
 }
@@ -1832,15 +1837,7 @@ OK:
                        break;
 
                if (err) {
-                       const char *s;
-
-                       err = nd_alloc_stack(nd);
-                       if (unlikely(err)) {
-                               path_to_nameidata(&nd->link, nd);
-                               break;
-                       }
-
-                       s = get_link(nd);
+                       const char *s = get_link(nd);
 
                        if (unlikely(IS_ERR(s))) {
                                err = PTR_ERR(s);
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to