From c5b990c28798b5e73534dab9d32ace7bd04df66d Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sat, 28 Apr 2012 14:38:32 -0700 Subject: [PATCH] --- yaml --- r: 300367 b: refs/heads/master c: 3f9f0aa687d45cbc8e7bb3cfd3aab555dcc8872e h: refs/heads/master i: 300365: 67b48730948861ed42d9bb9dbbfd772c25aa69bf 300363: da0c84ad1feb9e23312b12a3f83cbc7c73c01c60 300359: 94f4d66bc0987009042e7d0a472aa1d6cc9386a1 300351: ffb94fd71ffa2a9049d7e18955f3b97b292965ad v: v3 --- [refs] | 2 +- trunk/fs/namei.c | 58 ++++++++++++++++++++---------------------------- 2 files changed, 25 insertions(+), 35 deletions(-) diff --git a/[refs] b/[refs] index addee24939ac..318388064517 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0749708352fddbe0fa81fc25f96e3b1f77c655f4 +refs/heads/master: 3f9f0aa687d45cbc8e7bb3cfd3aab555dcc8872e diff --git a/trunk/fs/namei.c b/trunk/fs/namei.c index 0062dd17eb55..494b1caa25f8 100644 --- a/trunk/fs/namei.c +++ b/trunk/fs/namei.c @@ -116,47 +116,37 @@ * POSIX.1 2.4: an empty pathname is invalid (ENOENT). * PATH_MAX includes the nul terminator --RR. */ -static int do_getname(const char __user *filename, char *page) -{ - int retval; - unsigned long len = PATH_MAX; - - if (!segment_eq(get_fs(), KERNEL_DS)) { - if ((unsigned long) filename >= TASK_SIZE) - return -EFAULT; - if (TASK_SIZE - (unsigned long) filename < PATH_MAX) - len = TASK_SIZE - (unsigned long) filename; - } - - retval = strncpy_from_user(page, filename, len); - if (retval > 0) { - if (retval < len) - return 0; - return -ENAMETOOLONG; - } else if (!retval) - retval = -ENOENT; - return retval; -} - static char *getname_flags(const char __user *filename, int flags, int *empty) { - char *result = __getname(); - int retval; + char *result = __getname(), *err; + int len; - if (!result) + if (unlikely(!result)) return ERR_PTR(-ENOMEM); - retval = do_getname(filename, result); - if (retval < 0) { - if (retval == -ENOENT && empty) + len = strncpy_from_user(result, filename, PATH_MAX); + err = ERR_PTR(len); + if (unlikely(len < 0)) + goto error; + + /* The empty path is special. */ + if (unlikely(!len)) { + if (empty) *empty = 1; - if (retval != -ENOENT || !(flags & LOOKUP_EMPTY)) { - __putname(result); - return ERR_PTR(retval); - } + err = ERR_PTR(-ENOENT); + if (!(flags & LOOKUP_EMPTY)) + goto error; } - audit_getname(result); - return result; + + err = ERR_PTR(-ENAMETOOLONG); + if (likely(len < PATH_MAX)) { + audit_getname(result); + return result; + } + +error: + __putname(result); + return err; } char *getname(const char __user * filename)