namei: add getname_uflags()
authorDmitry Kadashev <dkadashev@gmail.com>
Thu, 8 Jul 2021 06:34:42 +0000 (13:34 +0700)
committerJens Axboe <axboe@kernel.dk>
Mon, 23 Aug 2021 19:41:26 +0000 (13:41 -0600)
There are a couple of places where we already open-code the (flags &
AT_EMPTY_PATH) check and io_uring will likely add another one in the
future.  Let's just add a simple helper getname_uflags() that handles
this directly and use it.

Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Christian Brauner <christian.brauner@ubuntu.com>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Link: https://lore.kernel.org/io-uring/20210415100815.edrn4a7cy26wkowe@wittgenstein/
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
Signed-off-by: Dmitry Kadashev <dkadashev@gmail.com>
Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
Link: https://lore.kernel.org/r/20210708063447.3556403-7-dkadashev@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/exec.c
fs/namei.c
include/linux/fs.h

index 38f6345..3b78b22 100644 (file)
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -2070,10 +2070,8 @@ SYSCALL_DEFINE5(execveat,
                const char __user *const __user *, envp,
                int, flags)
 {
-       int lookup_flags = (flags & AT_EMPTY_PATH) ? LOOKUP_EMPTY : 0;
-
        return do_execveat(fd,
-                          getname_flags(filename, lookup_flags, NULL),
+                          getname_uflags(filename, flags),
                           argv, envp, flags);
 }
 
@@ -2091,10 +2089,8 @@ COMPAT_SYSCALL_DEFINE5(execveat, int, fd,
                       const compat_uptr_t __user *, envp,
                       int,  flags)
 {
-       int lookup_flags = (flags & AT_EMPTY_PATH) ? LOOKUP_EMPTY : 0;
-
        return compat_do_execveat(fd,
-                                 getname_flags(filename, lookup_flags, NULL),
+                                 getname_uflags(filename, flags),
                                  argv, envp, flags);
 }
 #endif
index 522c35b..41f58da 100644 (file)
@@ -203,6 +203,14 @@ getname_flags(const char __user *filename, int flags, int *empty)
        return result;
 }
 
+struct filename *
+getname_uflags(const char __user *filename, int uflags)
+{
+       int flags = (uflags & AT_EMPTY_PATH) ? LOOKUP_EMPTY : 0;
+
+       return getname_flags(filename, flags, NULL);
+}
+
 struct filename *
 getname(const char __user * filename)
 {
index 6405742..26d41a4 100644 (file)
@@ -2786,6 +2786,7 @@ static inline struct file *file_clone_open(struct file *file)
 extern int filp_close(struct file *, fl_owner_t id);
 
 extern struct filename *getname_flags(const char __user *, int, int *);
+extern struct filename *getname_uflags(const char __user *, int);
 extern struct filename *getname(const char __user *);
 extern struct filename *getname_kernel(const char *);
 extern void putname(struct filename *name);