diff options
| author | Mateusz Guzik <[email protected]> | 2024-06-04 15:52:57 +0000 |
|---|---|---|
| committer | Christian Brauner <[email protected]> | 2024-06-21 09:40:49 +0000 |
| commit | d4f50ea957cab6ea940cc072a142b1e964a10ee6 (patch) | |
| tree | 3a24bad3b29b9086327d5bca7794698c06283037 | |
| parent | vfs: retire user_path_at_empty and drop empty arg from getname_flags (diff) | |
| download | kernel-d4f50ea957cab6ea940cc072a142b1e964a10ee6.tar.gz kernel-d4f50ea957cab6ea940cc072a142b1e964a10ee6.zip | |
vfs: shave a branch in getname_flags
Check for an error while copying and no path in one branch.
Signed-off-by: Mateusz Guzik <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Reviewed-by: Jan Kara <[email protected]>
Signed-off-by: Christian Brauner <[email protected]>
| -rw-r--r-- | fs/namei.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/fs/namei.c b/fs/namei.c index 950ad6bdd9fe..3d3674c21d3c 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -148,9 +148,20 @@ getname_flags(const char __user *filename, int flags) result->name = kname; len = strncpy_from_user(kname, filename, EMBEDDED_NAME_MAX); - if (unlikely(len < 0)) { - __putname(result); - return ERR_PTR(len); + /* + * Handle both empty path and copy failure in one go. + */ + if (unlikely(len <= 0)) { + if (unlikely(len < 0)) { + __putname(result); + return ERR_PTR(len); + } + + /* The empty path is special. */ + if (!(flags & LOOKUP_EMPTY)) { + __putname(result); + return ERR_PTR(-ENOENT); + } } /* @@ -180,6 +191,12 @@ getname_flags(const char __user *filename, int flags) kfree(result); return ERR_PTR(len); } + /* The empty path is special. */ + if (unlikely(!len) && !(flags & LOOKUP_EMPTY)) { + __putname(kname); + kfree(result); + return ERR_PTR(-ENOENT); + } if (unlikely(len == PATH_MAX)) { __putname(kname); kfree(result); @@ -188,14 +205,6 @@ getname_flags(const char __user *filename, int flags) } atomic_set(&result->refcnt, 1); - /* The empty path is special. */ - if (unlikely(!len)) { - if (!(flags & LOOKUP_EMPTY)) { - putname(result); - return ERR_PTR(-ENOENT); - } - } - result->uptr = filename; result->aname = NULL; audit_getname(result); |
